2011-01-20 16 views

risposta

9

Basta rimuovere il numero seme nel costruttore. Questo seme è essenzialmente un numero da cui viene generata la lista di numeri casuali. Se si specifica un numero costante, l'elenco dei numeri casuali sarà sempre lo stesso.

Random rand = new Random(); 
rand.Next(); 
+0

limiterà il numero di caratteri generati o può generare 10000 o 1000000000 – maztt

+0

Non penso che ci sia un limite alla quantità di numero generato. Inoltre, non è correlato a un numero di caratteri poiché il metodo '.Next()' restituisce un intero con segno a 32 bit maggiore o uguale a zero e inferiore a MaxValue. –

4

Non so esattamente che cosa siete dopo!

Random rand = new Random(Environment.TickCount); 
rand.Next(); 
+0

+1 mentre il conto di spunta non è un gran seme è dinamico e per scopi generali probabilmente * abbastanza buono *. –

+0

In futuro, potrebbe essere meglio non tentare di rispondere a una domanda quando, come dici tu, non sei sicuro esattamente di quello che stanno cercando. – DOK

+0

ok grazie, sembra che abbia assunto lo stesso valore di tutti gli altri :) – WraithNath

7

Specificare lo stesso seme provare questo.

Random rand = new Random(); 
rand.Next(); 

Questa utilizzerà il seme di default che è il tempo.

"Inizializza una nuova istanza della classe Random, utilizzando un valore di inizializzazione predefinito dipendente dal tempo."

Come da MSDN: http://msdn.microsoft.com/en-us/library/system.random.aspx

Re vostro commento di cui sopra, come generare un numero "casuale" in un intervallo definito.

// Generate and display 5 random integers from 50 to 100. 
Console.WriteLine("Five random integers between 50 and 100:"); 
Console.Write("{0,8:N0}", rand.Next(50, 101)); 

(Tratto da collegamento MSDN sopra) È ora possibile generare qualunque gamma che si desidera.

+0

C'è un potenziale problema con l'utilizzo del seme temporale predefinito. Per un'app multi-thread in esecuzione su un processore multi-core, diventa relativamente probabile che due thread diversi generino esattamente lo stesso valore casuale (poiché diventa possibile per loro prelevare lo stesso identico tempo di sistema e quindi produrre lo stesso valore) . Userei invece un hash di un Guid.NewGuid() come seme. – MusiGenesis

+0

Se si stesse sviluppando un'applicazione di questo tipo, correggere, tuttavia l'uso della classe Random() non dovrebbe essere usato per qualcosa di diverso dal fare apparire le cose casuali. – LiamB

+0

La domanda viene contrassegnata con "asp.net", che è esattamente il tipo di ambiente multi-thread che può produrre questo tipo di problemi. Due utenti che eseguono lo stesso codice nello stesso momento potrebbero vedere gli stessi valori "casuali". – LukeH

0
Random rand = new Random(); 
rand.Next(0,1000); // minimum = 0, maximum = 999 
+6

Vale la pena dire che il minimo è inclusivo, il massimo è esclusivo. Quanto sopra genererà un numero nell'intervallo (compreso) 0-999. –

+0

@lain non sapeva che ... buon occhio – WernerCD

3
Random rand=new Random(DateTime.Now.Millisecond); 
rand.Next(); 

funziona questo sempre per me.

+0

Perché non solo 'nuovo Random()', dal momento che usa 'Environment.TickCount' come seme predefinito? – LukeH

+0

@LukeH: hai qualche documentazione in proposito? Tutto ciò che ho mai visto documentato è che è basato su un valore basato sul tempo, il che non significa necessariamente che stia usando 'Environment.TickCount'. – MusiGenesis

+0

@MusiGenesis: Penso che sia un dettaglio di implementazione piuttosto che una garanzia specificata, ma è abbastanza facile confermare da solo utilizzando ILDASM o Reflector. O facendo qualcosa come 'var r1 = new Random(); var r2 = new Random (Environment.TickCount); while (true) Console.WriteLine (r1.Next() == r2.Next()); 'dovrebbe visualizzare" true "continuamente a meno che tu non sia * veramente * sfortunato e che i due costruttori girino su entrambi i lati di un tick. – LukeH

Problemi correlati