2010-03-03 2 views
7

Io uso questo codice per generare un numero casuale.Creare un numero int casuale che differisce dalla precedente esecuzione del programma

Random R = new Random(0); 
int Rand = R.Next(7); 

ma ottengo lo stesso numero casuale in ogni esecuzione del programma.

+1

seme tuo generatore di numeri casuali – vladr

+2

che è una caratteristica, non un bug :) –

+0

E solo una nota a margine: Un seme di '0' è meglio evitato nella maggior parte dei PRNG. Alcune implementazioni aggirano il problema ma non dovresti fare affidamento su questo. – Joey

risposta

10

devi cambiare il seme del tuo generatore di numeri casuali ogni volta che esegui il tuo programma, come quello che ho visto dal tuo esempio, il tuo seme corrente è 0, quindi devi cambiarlo in qualcos'altro se vuoi per ottenere un flusso diverso di numeri casuali ... solo un pensiero!

0

Usa il tempo come seme iniziale del tuo PRNG.

0

È necessario seminare la classe Random con qualcosa di più variabile di 0. Io di solito uso DataTime.Now.Ticks oppure è possibile utilizzare il valore intero di un nuovo Guid.

0

È necessario seminare il generatore casuale. È possibile utilizzare come segue:

R casuale = nuovo casuale (DateTime.Now.Millisecond);

int Rand = R.Next (7);

3

Sementi il ​​generatore (pseudo) casuale che utilizza un valore non costante, ad es. ora e la data:

Random R = new Random(DateTime.Now.Ticks); 

Per saperne di più pseudo-random generators at Wikipedia.

+0

+1 per non selezionato - questo è un nuovo su di me. – Paddy

+0

Vedere la sezione 'Esempi 'nella documentazione @ http://msdn.microsoft.com/en-us/library/ctssatww.aspx – vladr

+1

non necessaria, la funzione di costruzione senza parametri richiede automaticamente il valore di seme basato sul tempo – Marek

13

Rimuovere lo 0 dal costruttore e otterrete numeri casuali diversi.

Se si passa un numero al costruttore viene utilizzato come seme, specificando sempre 0 si otterrà sempre la stessa sequenza.

è possibile specificare un Int32, che è casuale, ma il più semplice è non solo di passare qualsiasi parametro e si ottiene un seme timebased

+0

+1 per essere l'unico a suggerire l'ovvio; usare il costruttore senza parametri. – Guffa

0

generatori di numeri casuali generano un nuovo valore 'casuale' in base al numero precedente generato. Il seme è il valore iniziale per questo.

Seeding con lo stesso valore (come 0 nel codice di esempio), in pratica indica al generatore di numeri casuali di iniziare ogni volta con lo stesso numero. Avere lo stesso numero casuale generato ogni volta significa che il tuo codice diventa riavviabile. Esempio: le simulazioni utilizzano questo per riavviare la simulazione con i parametri modificati, ma con lo stesso 'set di dati'.

Un altro esempio:

voglio inviare un messaggio me motivazionale ogni giorno. A volte i messaggi sono confusi. Essere in grado di rieseguire la sceneggiatura, produrre lo stesso messaggio più e più volte durante un giorno, rende semplice la correzione. In codice Perl questo significa:

# By initialising the random generator with the day number since 
# the epoch, we get the same quote during one day. 
srand(time()/(24*3600)); 
my $i = int(rand(@messages)); 

Se si vuole produrre diversi numeri ogni volta, si dovrà impostare questo seme di qualcosa di casuale. Le opzioni sono molte, come il tempo, il PID, il ritardo tra due sequenze di tasti da parte dell'utente, un valore derivato dall'interfaccia ethernet, ecc. O più probabilmente una combinazione del precedente come time*PID.

Spero che questo chiarisca l'idea alla base del concetto di un valore di seme numero casuale.

0

se vogliamo un numero casuale compreso tra 1 e 100 del codice sarebbe simile a questa: RandomNumberGenerator.GetRandomInt (1, 100)

0

Il modo più sicuro per generare numeri casuali è quello di utilizzare lo System.Security. Cryptography.RandomNumberGenerator class.

Ecco un esempio che genererà un numero compreso tra 1 e 100;

public Number Rand() 
{ 

    byte[] Salt = new byte[8]; 

    System.Security.Cryptography.RandomNumberGenerator.Create().GetBytes(Salt); 

    decimal result = 0; 

    foreach (byte b in Salt) 
{ 

    result = result * 255 + b; 

} 

while (result > 100) 

{ 

    result /= 10; 

} 

return result 

}

0

codice completo:

public static class RandomHelper 
{ 
    static object _myLock = new object(); 
    static Random _random = new Random(); 

    public static int RandomNumber(int min, int max) 
    { 

     lock (_myLock) 
     { 
      if (min == max) 
       return min; 

      if (min > max) 
       return _random.Next(max, min); 

      return _random.Next(min, max); 
     } 

}