2012-11-19 14 views
5

Vorrei creare un ciclo for che esegua il loop dei numeri da 0 a 8 in ordine casuale. Nota che ogni numero può essere visitato solo una volta.iterazione casuale in ciclo for

Come posso ottenere questo risultato?

+3

[Questa domanda SO] (http://stackoverflow.com/ domande/254844/random-array-using-linq-and-c-sharp) è quello che stai cercando – Zbigniew

+0

Ho provato a fare una lista dei numeri interi 0-8 e ad assumere a caso e rimuovendolo in seguito. Ma nel mio programma sto usando un metodo ricorsivo in cui tale soluzione non è pratica –

+0

@BrunoCarvalhal Forse dovresti pubblicare un esempio di come hai progettato la tua ricorsione in quanto sembra essere un elemento significativo della tua domanda/risposta. –

risposta

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

Quello che stavo per digitare e anche simile a ciò che è collegato qui http://stackoverflow.com/a/254861/659190 – Jodrell

+1

Perfetto!Esattamente quello che stavo cercando. Mi sono concentrato su un ciclo for mentre avrei dovuto usare questo ciclo foreach. –

+0

Ottima risposta. Se aiuta altri noob come me, IEnumerable.OrderBy è un metodo di estensione nello spazio dei nomi System.Linq. – geo

6
  1. generare un array di indici da 0 a 8
  2. Mescola matrice
  3. iterare matrice utilizzando l'indice in quella posizione
+0

Perché nel mondo hai eliminato gli 8? – LMB

+0

Probabilmente un errore di battitura – RvdK

+0

Probabilmente ho sbagliato a capire che si trattava di un array/elenco di lunghezza '8', quindi avresti voluto solo gli indici degli elementi' 0' a '7'. –

1

Una 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() crea un li st contenente i numeri da 0 a 8. Quindi nel ciclo scegliamo un numero casuale dall'elenco e lo rimuoviamo dall'elenco alla fine del ciclo, in modo che il ciclo successivo non possa essere scelto di nuovo.

0

Trovato da una ricerca Web - Fisher-Yates shuffle, implementato in Perl.

Questo genererà una randomizzazione imparziale di qualsiasi array di input.

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]; 
    } 
} 

Per maggiori informazioni:

http://en.wikipedia.org/wiki/Fisher%E2%80%93Yates_shuffle

e l'originale che ho trovato era da:

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

+0

troppi '$' s per C# –

+2

troppo 'perl' per' C# ' –

+0

È più l'algoritmo che il codice. Non posso parlare per natura imparziale della funzione Random() in C#, mentre Fisher-Yates lo è sicuramente. – tbh