2012-11-19 3 views
5

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?

+3

[Cette question SO] (http://stackoverflow.com/ questions/254844/random-array-linq-et-c-sharp) est ce que vous cherchez – Zbigniew

+0

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 –

+0

@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. –

Répondre

14
Random r = new Random(); 
foreach (int i in Enumerable.Range(0, 9).OrderBy(x => r.Next())) 
{ 
    Console.WriteLine(i); 
} 
+0

Ce que j'étais sur le point de taper et aussi similaire à ce qui est lié ici http://stackoverflow.com/a/254861/659190 – Jodrell

+1

Parfait!Exactement ce que je cherchais. Je me suis trop concentré sur une boucle for alors que j'aurais dû utiliser cette boucle foreach. –

+0

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

6
  1. Générer un tableau des indices 0 à 8
  2. aléatoire tableau
  3. itérer sur le tableau en utilisant l'indice à cette position
+0

Pourquoi dans le monde vous avez pris le 8? – LMB

+0

Probablement une faute de frappe – RvdK

+0

Probablement juste mal compris en pensant qu'il s'agissait d'un tableau/liste de longueur '8', donc vous ne voulez que les indices d'éléments' 0' à '7'. –

1

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.

0

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:

http://perl.livejournal.com/101830.html

+0

trop de '$' s pour C# –

+2

trop 'perl' pour' C# ' –

+0

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

Questions connexes