per quanto riguarda ". Quindi i risultati sono sempre di 18 cifre o 20 cifre. "
Vedere @Thomas comment. Se si genera un numero casuale Se il codice è lungo abbastanza, il codice creerà quelli come 5, 11 e 33387. Se il codice genera 1.000.000.000 di numeri/secondo, potrebbe essere necessario un anno come numeri molto piccoli < 100.000 sono così rari tra tutti i numeri a 64 bit.
rand()
bit semplici restituiti a caso. Procedimento semplicistico tira 1 bit alla volta
uint64_t rand_uint64_slow(void) {
uint64_t r = 0;
for (int i=0; i<64; i++) {
r = r*2 + rand()%2;
}
return r;
}
Supponendo RAND_MAX
è una potenza di 2 - 1 come nel caso del PO 1073741823 == 0x3FFFFFFF
, trarre vantaggio che 30 bit sono generati ogni volta. Il seguente codice chiamerà rand()
3 volte - un po 'dispendioso. Invece i bit spostati potrebbero essere salvati per il prossimo numero casuale, ma ciò porta ad altri problemi. Lascia stare per un altro giorno.
uint64_t rand_uint64(void) {
uint64_t r = 0;
for (int i=0; i<64; i += 30) {
r = r*((uint64_t)RAND_MAX + 1) + rand();
}
return r;
}
Procedimento numero di loop portatile evita i 30
#if RAND_MAX/256 >= 0xFFFFFFFFFFFFFF
#define LOOP_COUNT 1
#elif RAND_MAX/256 >= 0xFFFFFF
#define LOOP_COUNT 2
#elif RAND_MAX/256 >= 0x3FFFF
#define LOOP_COUNT 3
#elif RAND_MAX/256 >= 0x1FF
#define LOOP_COUNT 4
#else
#define LOOP_COUNT 5
#endif
uint64_t rand_uint64(void) {
uint64_t r = 0;
uint64_t r = 0;
for (int i=LOOP_COUNT; i > 0; i--) {
r = r*(RAND_MAX + (uint64_t)1) + rand();
}
return r;
}
Gli effetti autocorrelazione commentato here sono causati da un debole rand()
. C non specifica un particolare metodo di generazione di numeri casuali. Quanto sopra si basa su rand()
buono. Se rand()
è sotto-par, il codice dovrebbe utilizzare altri generatori per questo e rand()
.
** Non ** concatenate 'rand()', come avrete tutti i tipi di effetti di autocorrelazione, e la distribuzione non lo farà essere uniforme Date un'occhiata a questi: http://www.math.sci.hiroshima-u.ac.jp/~m-mat/MT/VERSIONS/C-LANG/c-lang.html – Bathsheba
'Voglio anche risultati come 5 , 11, 33387' => ci sono 10 volte più numeri tra 1000000000000000000 e 9999999999999999999 che tra 0 e 1000000000000000000 ... quindi non aspettarti di vedere numeri come 5 presto –
Sembra che tu sia confuso riguardo le cifre in base 10 (0. ..9) e bit (base-2 cifre). Tieni questi separati nel tuo pensiero, per una migliore comprensione. – hyde