2012-12-12 13 views
5

Eventuali duplicati:
Random number generator only generating one random numberIl codice viene eseguito correttamente solo quando lo si passa attraverso il debugger?

ero un po 'perplesso con questo pochi istanti fa. Ho il codice seguente:

public blockType generateRandomBlock() 
{ 
    Random random = new Random(); 
    int makeBlockOfType = random.Next(0, 100); 

    blockType t = blockType.normal; 
    if (makeBlockOfType <= 80 && makeBlockOfType >= 60) 
    { 
     t = blockType.blue; 
    } 
    else if (makeBlockOfType > 80 && makeBlockOfType <= 95) 
    { 
     t = blockType.orange; 
    } 
    else if (makeBlockOfType > 95 && makeBlockOfType <= 100) 
    { 
     t = blockType.green; 
    } 

    return t; 
} 

abbastanza semplice, esso restituisce un valore enum basata su un numero generato in modo casuale (base del tempo di sistema). Sfortunatamente per qualche strana ragione, ho tutti i blocchi di un colore o dell'altro anche se questo è valido per ogni singolo blocco inserito nel gioco. Tuttavia, quando passo a questo con il debugger e poi vedo i risultati dopo un po 'di corsa, vedo che i blocchi ora sono multi-colorati in base alle possibilità offerte. Sono un po 'confuso sul motivo per cui questo sta accadendo.

Per questo sto usando MonoGame che utilizza il compilatore Mono al posto di quello Microsoft. Potrebbe essere questo il problema? Ho provato a mettere questo codice in linea nel costruttore da dove viene chiamato, ma sto ottenendo lo stesso risultato (suppongo che il compilatore inline il codice comunque).

Ho provato a riavviare Visual Studio separatamente invece di lasciare che la corsa esegua la compilazione; nessun cambiamento.

Qualsiasi suggerimento e aiuto sono molto apprezzati!

+1

tenta di spostare la creazione a caso fuori del metodo, che dovrebbe aiutare. –

+0

'new Random()' seed che usa il tempo, che rimane costante per diversi millisecondi. – CodesInChaos

+0

La ragione per cui funziona nel debug è che c'è tempo tra le chiamate e Random in realtà ottiene semi diversi. – Archy

risposta

3

Quando si creano più istanze di Random successivamente in un periodo di tempo molto breve, è probabile che finiscano per essere inizializzate con lo stesso valore seme dipendente dal tempo.

Per aggirare questo, si dovrebbe inizializzare il Random come un campo di istanza invece:

private readonly Random random = new Random(); 

public blockType generateRandomBlock() 
{ 
    int makeBlockOfType = random.Next(0, 100); 

    // ... 
} 
7

Si dovrebbe instanciate a caso solo una volta (impostarlo come un campo privato e instanciate nel costruttore), vedere il simile domanda: Random.Next returns always the same values

Vedi le Random documentation:

Si avvia la generazione di numeri casuali da un valore seme. Se lo stesso seme viene utilizzata più volte, la stessa serie di numeri è generato

Nel tuo caso, si crea un'istanza casuale con lo stesso seme (troppo vicino nel tempo) e si prende il primo valore che sarà lo stesso per un dato seme.

4

si sta per ricreare il generatore di numeri casuali ogni volta che si chiama il metodo:

public blockType generateRandomBlock() 
{ 
    Random random = new Random(); 

Come il seme del generatore di numeri casuali è basato sul tempo di questo restituirà lo stesso valore per le chiamate successive.

Spostare la creazione del generatore di fuori della routine:

Random random = new Random(); 
public blockType generateRandomBlock() 
{