Implementazione Rand

Mi piacerebbe vedere come vengono implementate le funzioni rand () e srand () e vorrei modificare il codice per modificarlo in base alle mie esigenze. Dove posso trovare il codice sorgente di rand () e srand ().

Prende un seme come nell’argomento di input, solitamente come segue: –

double result = srand(time(NULL)); 

e restituisce un numero casuale che aderisce alla probabilità e quindi al numero previsto di occorrenze.

dai forum di CodeGuru : –

 void __cdecl srand (unsigned int seed) { #ifdef _MT _getptd()->_holdrand = (unsigned long)seed; #else /* _MT */ holdrand = (long)seed; #endif /* _MT */ } int __cdecl rand (void) { #ifdef _MT _ptiddata ptd = _getptd(); return( ((ptd->_holdrand = ptd->_holdrand * 214013L + 2531011L) >> 16) & 0x7fff ); #else /* _MT */ return(((holdrand = holdrand * 214013L + 2531011L) >> 16) & 0x7fff); #endif /* _MT */ } 

Spero che questo ti aiuti.

rand e srand sono solitamente implementati come un semplice LCG , puoi facilmente scrivere il tuo (sono poche righe di codice) senza cercare le fonti di rand e srand . Nota che se hai bisogno di numeri casuali per scopi “seri” (es. Crittografia), ci sono RNG molto migliori di LCG.

A proposito, lo standard C stesso include un’implementazione di esempio di rand e srand :

 static unsigned long int next = 1; int rand(void) // RAND_MAX assumed to be 32767 { next = next * 1103515245 + 12345; return (unsigned int)(next/65536) % 32768; } void srand(unsigned int seed) { next = seed; } 

Quello di glibc (usato da gcc) è la formula semplice:

 x = 1103515245 * x + 12345 

avvolgendo intorno a 2 32 , come mostrato qui . Puoi semplicemente impostare x come seme, quindi continuare a chiamare una funzione per valutare quell’espressione (e aggiornare il seme).

Ma dovresti essere consapevole che i generatori lineari congruenti come questo sono considerati adeguati ma non ideali.

Mentre l’unico generatore di numeri casuali ideale sarebbe perfettamente casuale, il Mersenne Twister probabilmente si avvicina.