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?
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?
Random r = new Random();
foreach (int i in Enumerable.Range(0, 9).OrderBy(x => r.Next()))
{
Console.WriteLine(i);
}
Quello che stavo per digitare e anche simile a ciò che è collegato qui http://stackoverflow.com/a/254861/659190 – Jodrell
Perfetto!Esattamente quello che stavo cercando. Mi sono concentrato su un ciclo for mentre avrei dovuto usare questo ciclo foreach. –
Ottima risposta. Se aiuta altri noob come me, IEnumerable.OrderBy è un metodo di estensione nello spazio dei nomi System.Linq. – geo
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.
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:
troppi '$' s per C# –
troppo 'perl' per' C# ' –
È più l'algoritmo che il codice. Non posso parlare per natura imparziale della funzione Random() in C#, mentre Fisher-Yates lo è sicuramente. – tbh
[Questa domanda SO] (http://stackoverflow.com/ domande/254844/random-array-using-linq-and-c-sharp) è quello che stai cercando – Zbigniew
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 –
@BrunoCarvalhal Forse dovresti pubblicare un esempio di come hai progettato la tua ricorsione in quanto sembra essere un elemento significativo della tua domanda/risposta. –