chodzi ". Zatem wyniki zawsze mają 18 cyfr lub 20 cyfr. "
Zobacz @Thomas comment. Jeśli generujesz liczbę losową s wystarczająco długo, kod utworzy takie jak 5, 11 i 33387. Jeśli kod generuje 1 000 000 000 numerów/sekundę, może to potrwać rok jako bardzo małe liczby. < 100 000 jest tak rzadkich spośród wszystkich 64-bitowych liczb.
proste zwroty losowe. Uproszczony sposób pociąga 1 bit w czasie
uint64_t rand_uint64_slow(void) {
uint64_t r = 0;
for (int i=0; i<64; i++) {
r = r*2 + rand()%2;
}
return r;
}
Zakładając RAND_MAX
pewna siła 2 - 1, jak w przypadku OP 1073741823 == 0x3FFFFFFF
, ma tę zaletę, że 30 bitów są generowane za każdym razem. Poniższy kod zadzwoni rand()
3 razy - odrobinę marnotrawstwa. Zamiast tego przesunięte bity można zapisać dla następnej losowej liczby, ale to powoduje inne problemy. Pozostaw to na inny dzień.
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;
}
przenośny sposób unika się licznik pętli 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;
}
Efekty autokorelacji komentuje here są spowodowane słabą rand()
. C nie określa konkretnej metody generowania liczb losowych. Powyższe dotyczy rand()
jest dobre. Jeśli rand()
jest podrzędny, wówczas kod powinien używać innych generatorów do tego i rand()
.
** Nie ** concatenate 'rand()' jak będziesz miał wszystkie rodzaje efektów autokorelacji i dystrybucja nie będzie być jednolity. Spójrz na te: http://www.math.sci.hiroshima-u.ac.jp/~m-mat/MT/VERSIONS/C-LANG/c-lang.html – Bathsheba
'Chcę również wyników takich jak 5 , 11, 33387' => istnieje 10 razy więcej liczb między 1000000000000000000 a 9999999999999999999 niż między 0 a 1000000000000000000 ... więc nie oczekuj, że cyfry takie jak 5 wkrótce –
Wydaje się, że jesteś zdezorientowany z powodu cyfr dziesięciocyfrowych (0. ..9) i bitów (2 cyfry). Trzymaj je oddzielnie w swoim myśleniu, dla lepszego zrozumienia. – hyde