Ok. Ecco quello che so che non funziona:Modo corretto per utilizzare Casuale nell'applicazione multithread
int Rand()
{
//will return the same number over and over again
return new Random().Next();
}
static Random rnd=new Random();
int Rand()
{
//if used like this from multiple threads, rnd will dissintegrate
//over time and always return 0
return rnd.Next();
}
Ciò funzionerà correttamente, ma se usato da più thread, l'utilizzo della CPU va verso l'alto, che io non voglio, e che credo non sia necessaria:
int Rand()
{
lock(rnd)
{
return rnd.Next();
}
}
Quindi, c'è una classe Random thread-safe per C#, o un modo migliore per usarlo?
Provare un 'ThreadLocal'. 'statico privato readonly ThreadLocal rand = new ThreadLocal (() => new Random());' –
@JeroenVannevel: Probabilmente vorrai randomizzare i semi delle istanze 'Random', perché altrimenti i thread partono allo stesso tempo otterrebbe la stessa sequenza di numeri casuali. – dtb
.. e prendere un'istanza casuale statica bloccata globale per il seed delle istanze casuali di ThreadLocal. – Ralf