Je voudrais faire une boucle for qui passe par les nombres 0-8 dans un ordre aléatoire. Notez que chaque nombre ne peut être visité qu'une seule fois.Itération aléatoire dans la boucle for
Comment puis-je y parvenir?
Je voudrais faire une boucle for qui passe par les nombres 0-8 dans un ordre aléatoire. Notez que chaque nombre ne peut être visité qu'une seule fois.Itération aléatoire dans la boucle for
Comment puis-je y parvenir?
Random r = new Random();
foreach (int i in Enumerable.Range(0, 9).OrderBy(x => r.Next()))
{
Console.WriteLine(i);
}
Ce que j'étais sur le point de taper et aussi similaire à ce qui est lié ici http://stackoverflow.com/a/254861/659190 – Jodrell
Parfait!Exactement ce que je cherchais. Je me suis trop concentré sur une boucle for alors que j'aurais dû utiliser cette boucle foreach. –
Bonne réponse. Si cela aide d'autres noobs comme moi, IEnumerable.OrderBy est une méthode d'extension dans l'espace de noms System.Linq. – geo
Une possibilité:
var numbers = Enumerable.Range(0, 9).ToList();
var rnd = new Random();
for (; numbers.Count != 0;)
{
var currentNumber = numbers[rnd.Next(0, numbers.Count)];
Console.WriteLine(currentNumber);
numbers.Remove(currentNumber); // remove current random number from list
}
Enumerable.Range(0, 9).ToList()
crée un li st contenant les nombres de 0 à 8. Ensuite, dans la boucle, nous choisissons un nombre aléatoire dans la liste et le retirons de la liste à la fin de la boucle, de sorte que le cycle suivant ne puisse plus être choisi.
Trouvé ceci d'une recherche de Web - shuffle de Fisher-Yates, implémenté dans Perl.
Cela générera une randomisation sans biais de n'importe quel tableau d'entrée.
sub fisher_yates_shuffle {
my $array = shift;
my $i;
for ($i = @$array; --$i;) {
my $j = int rand ($i+1);
next if $i == $j;
@$array[$i,$j] = @$array[$j,$i];
}
}
Pour plus d'informations:
http://en.wikipedia.org/wiki/Fisher%E2%80%93Yates_shuffle
Et l'original que j'ai trouvé de:
trop de '$' s pour C# –
trop 'perl' pour' C# ' –
C'est plus l'algorithme que le code. Impossible de parler de la nature non biaisée de la fonction Random() en C#, contrairement à Fisher-Yates. – tbh
[Cette question SO] (http://stackoverflow.com/ questions/254844/random-array-linq-et-c-sharp) est ce que vous cherchez – Zbigniew
J'ai essayé de faire une liste des entiers 0-8 et de prendre e au hasard et l'enlever après. Mais dans mon programme j'utilise une méthode récursive où une telle solution n'est pas pratique –
@BrunoCarvalhal Peut-être devriez-vous poster un exemple de comment vous avez conçu votre récursion car cela semble être un élément significatif de votre question/réponse. –