2010-06-16 26 views
6

con un problema che genera numeri casuali in un ciclo. Si può aggirare usando Thread.Sleep ma dopo una soluzione più elegante.Numero casuale in un loop

for ... 
    Random r = new Random(); 
    string += r.Next(4); 

finirà con 11111 ... 222 ... ecc

Suggerimenti?

+1

Se questo ciclo è più di alcune iterazioni, si vorrà abbandonare la concatenazione di stringhe a favore di un oggetto 'StringBuilder'. –

+5

@Anthony: No, ha bisogno di usare _more_ volta ogni iterazione. –

+0

@ Henk ... Ovviamente. Potrei suggerire un ciclo annidato per più concatenazioni di un singolo spazio, seguito immediatamente sostituendo lo spazio singolo con una stringa. Vuoto. –

risposta

50

Spostare la dichiarazione del generatore di numeri casuali fuori dal ciclo.

La generazione del numero casuale inizia da un valore di inizializzazione. Se lo stesso seme viene usato ripetutamente, viene generata la stessa serie di numeri. Un modo per produrre sequenze diverse è quello di rendere il valore seme dipendente dal tempo, producendo quindi una serie diversa con ogni nuova istanza di Random. Per impostazione predefinita, il costruttore senza parametri della classe Random utilizza l'orologio di sistema per generare il valore del seme, ...

Source

Avendo la dichiarazione nel ciclo si sta effettivamente chiamando il costruttore con la stessa valore più e più volte - quindi stai ottenendo gli stessi numeri.

Così il vostro codice dovrebbe diventare:

Random r = new Random(); 
for ... 
    string += r.Next(4); 
9
Random r = new Random(); 
for ... 
    string += r.Next(4); 

new Random() inizializza la (pseudo) generatore di numeri casuali con un seme in base alla data e l'ora corrente. Pertanto, due istanze di Random create nella stessa data e ora produrranno la stessa sequenza di numeri.

È stato creato un nuovo generatore di numeri casuali in ogni iterazione e quindi è stato preso il primo valore di tale sequenza. Poiché i generatori di numeri casuali erano uguali, il primo valore delle loro sequenze era lo stesso. La mia soluzione creerà un generatore di numeri casuali e restituirà il primo, il secondo, ecc., Valore della sequenza (che sarà diverso).

2

Si dovrebbe utilizzare la stessa istanza Casuale invece di crearne una nuova ogni volta.

Come è fatto:

for ... 
    Random r = new Random(); 
    string += r.Next(4); 

il valore del seme è lo stesso per ciascuno (il valore predefinito è il timestamp corrente) in modo che il valore restituito è lo stesso.

Riutilizzando una singola istanza a caso in questo modo:

Random r = new Random() 
for ... 
    string += r.Next(4); 

Ogni volta che si chiama r.Next(4) i valori vengono aggiornati (in pratica un seme diverso per ogni chiamata).

3

Sposta il Random r = new Random(); fuori dal ciclo e chiama subito dopo all'interno del ciclo.

+1

Avrei dovuto ricaricare la pagina. LOL tutti avevano la stessa risposta – used2could

+0

la domanda è "INSIDE OF LOOP" – Mironline

+0

@Mironline forse non hai letto la mia intera risposta, dichiaro anche di lasciare "next inside the loop". La risposta accettata è stata esattamente come ho descritto, quindi presumo che sia adatta alla richiesta dell'OP. – used2could

2

ho trovato una pagina in cinese che ha detto la stessa cosa con il tempo: http://godleon.blogspot.hk/2007/12/c.html, ha detto se si digita in questo modo:

Random random = new Random(Guid.NewGuid().GetHashCode());

si può ottenere un numero casuale, anche in un ciclo! Ha risolto anche la mia domanda!

+0

perché renderlo lento, solo 'Guid.NewGuid(). GetHashCode()' sarà sufficiente – nawfal

+0

@nawfal Non capisco davvero cosa stai dicendo ?? !! Non l'ho fatto? –

+0

Intendevo 'Guid.NewGuid(). GetHashCode()' sarà più veloce di 'new Random (Guid.NewGuid(). GetHashCode())'. Entrambi forniscono numeri interi casuali – nawfal