Vorrei passare al modo in cui le funzioni rand() e srand() sono implementate e vorrei modificare il codice per modificarlo in base alle mie esigenze. Dove posso trovare il codice sorgente di rand() e srand().Implementazione di Rand
risposta
Si prende un seme come argomento di input, di solito come segue: -
double result = srand(time(NULL));
e restituisce un numero casuale che aderisce alla probabilità e quindi al numero previsto di occorrenze.
da CodeGuru forums: -
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 aiuti.
rand
e srand
sono generalmente implementato come un semplice LCG, si può facilmente scrivere il proprio (è poche righe di codice) senza cercare le fonti di rand
e srand
. Nota che, se hai bisogno di numeri casuali per scopi "seri" (ad es. Crittografia), ci sono RNG molto migliori di LCG.
proposito, il C standard stesso include un esempio di implementazione 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 glibc (usato da gcc) è la semplice formula:
x = 1103515245 * x + 12345
d'involucro intorno al 2 , come mostrato here. Puoi semplicemente impostare x
come seme, quindi continuare a chiamare una funzione per valutare quell'espressione (e aggiornare il seme).
Ma si dovrebbe essere consapevoli 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.
s/adeguato/mediocre /, direi. –
- 1. implementazione gcc di rand()
- 2. PHP - Is rand (1,1000) = 1000 come probabile come rand (1,1000) = rand (1,1000)?
- 3. replace rand() con openssl_random_pseudo_bytes()
- 4. ORDER BY RAND() alternativa
- 5. MonadParallel Instance for Rand
- 6. std :: uniform_real_distribution e rand()
- 7. Raggruppa per valore RAND()
- 8. mysql RAND() LIMITE
- 9. SQLite - ORDER BY RAND()
- 10. Perché 1103515245 viene utilizzato in rand?
- 11. Devo usare rand() o rand_s()?
- 12. Perl: l'output di rand() è parzialmente prevedibile?
- 13. è mt_rand() più sicuro di rand()
- 14. È davvero rand() così male?
- 15. Ordina per rand() in yii2
- 16. ORDINA DA RAND non funziona
- 17. Difficoltà con pacchetto Go Rand
- 18. PHP rand() escludere certi numeri
- 19. stdlib's rand() fornisce sempre la stessa sequenza?
- 20. Restituisce risultati casuali (ordine by rand())
- 21. MySQL: Alternative a ORDER BY RAND()
- 22. È rand() dipendente dal tempo in php?
- 23. rand()% 4000000000UL dare solo valori piccoli
- 24. PHP rand() ... ottieni risultati 50/50 veri?
- 25. Perché rand() non è davvero casuale?
- 26. utilizzando rand per generare numeri casuali
- 27. Perché RAND non funziona con AbstractFloat?
- 28. Usa rand() per generare numeri nella tabella di divisione
- 29. MySQL seleziona la prestazione casuale di row - rand()
- 30. - implementazione
Grazie a ... ma cos'è _MT ?? – nikhil
Secondo questo codice 'holdrand' crescerebbe rapidamente e presto causerebbe un trabocco. 'holdrand = holdrand * 214013L + 2531011L' – orlp
Informazioni su' double result = srand (time (NULL)); ': perché mai hai quel' double result'? 'srand' non ha un valore di ritorno ... –