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
3 Réponses :
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? Et depuis que vous avez écrit, vous Spécifiquement vouloir utiliser la méthode randi code>, je suppose qu'il y a une raison, vous ne voulez pas utiliser randperm (12, 6) code> !? p> p>
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.
Je sais que cette fonction simple peut simplement produire ce que je veux, mais je ne veux pas utiliser cette fonction
Si vous essayez de reproduire C'est le Fisher -Yates shuffle . Si vous avez un vecteur randsample code> (ou randperm code>), pourquoi pas seulement reproduire l'algorithme Matlab utilise? (Pour autant que nous puissions le dire ...) 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
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 code> ) 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 a>.
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