2011-10-29 14 views
6

Sto lavorando su un algoritmo di generazione del terreno scorrevole in C# e utilizzando XNA per visualizzare i dati.Oggetto casuale non disposto in C#

Sto facendo in modo che crei un nuovo punto a metà tra ciascun punto per iterazione, ad un'altezza casuale tra i due. Funziona OK, e l'ho impostato in modo che nella seconda iterazione scelga un punto casuale come nella diapositiva due, piuttosto che cercare di creare un nuovo punto tra i punti che si trovano sullo stesso asse.

cosa accade è che il ciclo utilizza lo stesso valore casuale dalla iterazione precedente: http://i.stack.imgur.com/UmWr7.png

Questo non è ideale, ovviamente, in quanto non è una generazione casuale corretta.

Se io uso un Thread.Sleep(20) dopo ogni generazione punto funziona correttamente: http://i.stack.imgur.com/KziOg.png

Io non voglio avere a utilizzare il Sleep soluzione, se possibile, in quanto è molto lento, e vorrei utilizzare questo in tempo reale. Sono abbastanza sicuro che questo abbia qualcosa a che fare con il garbage collector C#.

Qui è la mia ottenere il punto Codice

Random r = new Random(); 
int x = (p1.X + p2.X)/2; 
int y; 
if (!initial) 
     y = r.Next(Math.Min(p1.Y, p2.Y), Math.Max(p1.Y, p2.Y)); 
else 
     y = r.Next(Math.Min(p1.Y, p2.Y) - Game1.screenHeight/2, Math.Max(p1.Y, p2.Y) + Game1.screenHeight/2); 
return new Point(x, y); 

è la raccolta dei rifiuti una parte del problema?

Eventuali suggerimenti o soluzioni per risolvere questo ??

risposta

10

Probabilmente si sta creando un nuovo oggetto casuale in un ciclo.

for (/* ... */) { 
    int x = new Random().Next(); // Don't do this! 
    // ... 
} 

Provare a creare solo un'istanza di Casuale all'avvio del programma, quindi riutilizzarla. Se si dispone di più thread, è possibile utilizzare un oggetto casuale per thread.

+0

Ahh non posso credere di non averlo visto. Grazie mille per l'aiuto. – FrenchyNZ

6

Sembra che probabilmente stai creando una nuova istanza di Random su ogni iterazione . Questo prenderà il suo seme dal tempo corrente - quindi senza un sonno, si finisce con lo stesso valore ripetutamente; con un sonno finisci per avere un seme diverso.

La risposta è di riutilizzare unoRandom esempio in tutto il programma - ma prendendo atto del fatto che Random non è thread-safe. Se tutto il tuo lavoro viene svolto nel thread dell'interfaccia utente, starai bene, ma altrimenti potresti voler utilizzare uno degli approcci che ho dato nel mio article about Random (che parla di questo problema in più).


E sì, ora che hai postato il codice che è davvero il caso.

+0

Grazie per le informazioni su Random non essere "thread-safe" anche molto utile – FrenchyNZ

Problemi correlati