-1
votes

Produire 6 nombre différent en utilisant uniquement "Randi" et certaines boucles

Je veux utiliser uniquement "Randi" cette fonction pour produire le numéro 6 différent de manière aléatoire dans MATLAB et la plage de ces 6 chiffres est 1 ~ 12.

number=randi([1,12],1,6)
c=0;
        for n=1:6%when "n" is 1 to 6
            while c <= 6  %while c is less equal than 6,do the program below  
                  c = c + 1; %c=c+1
                  if number(n) == number(c) %when the nth element is equal to cth element
                     number(n) = randi(12); %produce a random integer in the nth element
                     c = 0; %the reason why i set c=0 again is because i want to check again whether  the new random integer is the same as cth element or not
                  end
            end
        end   
final_number=number


0 commentaires

3 Réponses :


1
votes

Puisque vous sélectionnez des nombres aléatoires simples, lorsqu'il y a une surprise plusieurs fois, pourquoi ne pas simplement sélectionner tous les numéros à la fois? XXX

Et depuis que vous avez écrit, vous Spécifiquement vouloir utiliser la méthode randi , je suppose qu'il y a une raison, vous ne voulez pas utiliser randperm (12, 6) !?


3 commentaires

Oui, la raison est que je peux utiliser le randperm à Matlab, mais je ne peux pas utiliser cette fonction dans d'autres programmes. Je ne veux pas dire que je peux simplement écrire les 6 numéros différents de Matlab, car je peux simplement utiliser le "Randperm "Pour finir


Alors, comment devrais-je améliorer le code? Pouvez-vous me montrer? Au fait, est "unique" cette fonction peut être utilisée dans l'autre programme, comme c?


Presque toutes les méthodes peuvent être implémentées dans presque tous les langages de programmation. Vous avez spécifiquement demandé une solution à l'aide de MATLAB. Tout portage dans d'autres langues serait votre part.




1
votes

Si vous essayez de reproduire randsample code> (ou randperm code>), pourquoi pas seulement reproduire l'algorithme Matlab utilise? (Pour autant que nous puissions le dire ...)

C'est le Fisher -Yates shuffle . Si vous avez un vecteur V code>, chaque itération sélectionne un élément aléatoire, précédemment inutilisé et la met à la fin des éléments non sélectionnés. Si vous faites k code> itérations, les derniers éléments code> k code> de la liste sont votre échantillon aléatoire. Si k code> est égal au nombre d'éléments dans V code>, vous avez mélangé l'ensemble de la matrice. P>

>> fisher_yates_sample(1:12,6)
ans =

    5   11    6   10    8    4


7 commentaires

Bonne réponse. Bizarre de voir le mélange à partir de la fin, mais je suppose que cela a du sens avec Matlab.


@Crisluengo Il est fait de cette façon dans d'autres langues aussi, simplement parce qu'il est plus intuitif d'avoir les indices aléatoires générés à partir d'une plage de 0.. / code> (ou 1..n ) Plutôt que de devoir ajouter un décalage croissant sur chaque itération. C'est la façon dont il est décrit dans le lien Wikipedia sous L'algorithme moderne .


Qu'est-ce que cette ligne signifie v ([fin-n, randnum]) = v ([randnum, fin-n]); Qu'est-ce que fin-n?


Enfin, quelqu'un n'a pas utilisé le randperm pour améliorer ce problème


Hummmm. J'ai toujours pensé à cela comme échange (0-indexé) N et N + Randnum. Afin que les premiers n éléments soient une sélection aléatoire. Mais je ne l'ai jamais mis en œuvre moi-même. :)


@ 蕭仰恩 Cette ligne sonne deux éléments dans la matrice. C'est une syntaxe matlab peu cryptique, mais le moyen le plus efficace d'échanger.


oh donc cette ligne signifie shuffer cartes pour K fois