Finora ho usato il C# Mersenne Twister trovato qui per generare numeri casuali:C# Mersenne Twister implementazione generatore numero intero casuale (SFMT) simulazione Monte Carlo
http://www.centerspace.net/resources.php
Ho appena scoperto SFMT che è dovrebbe essere due volte più veloce qui:
http://www.math.sci.hiroshima-u.ac.jp/~m-mat/MT/SFMT/
Qualcuno può indicarmi un'implementazione C# di SFMT?
I miei requisiti sono di generare un numero intero compreso tra (e compreso) 0 e 2^20 (1048576).
ho bisogno di fare questo bilioni di volte tutti i giorni per una simulazione in esecuzione su un orologio di 24 ore, quindi sono disposti a spendere giorni tweaking questo alla perfezione.
Attualmente ho modificato il Centro Spaziale Mersenne Twister con l'aggiunta di un nuovo metodo per soddisfare le mie esigenze:
public uint Next20()
{
return (uint)(genrand_int32() >> 12);
}
Utilizzando il metodo genrand_int32()
mi piacerebbe produrre la mia versione, genrand_int20()
, che genera un intero tra (e compreso) 0 e 2^20 per salvare sulla trasmissione sopra e spostare ma non capisco la matematica. Esattamente come posso fare questo?
Inoltre si sta utilizzando un uint che sarà più veloce di quello o è solo una questione di numeri indirizzabili? Perché ho solo bisogno di un massimo di 1048576, mi interessa solo la velocità.
Anche questo sarà in esecuzione su un 2003 R2 SP2 scatola (32 bit) di Windows Server con .NET 2. Il processore è AMD Opteron 275 (4 core).
Un numero a 20 bit rappresenterà la gamma 0-2^20-1 inclusiva, 2^20 richiede 21 bit per rappresentare (un 1 seguito da 20 zeri) –
Nifle: Non confondere il * periodo * del generatore (che è la lunghezza della sequenza) con un * intervallo * in cui si desidera numeri casuali. – Joey
@Patrick grazie sei corretto 2^20-1 è quello che mi serve, ho bisogno di indicizzare casualmente in una matrice di lunghezza 2^20. – m3ntat