Szukam jakiegoś prostego w obsłudze generatora liczb pseudolosowych __int64. Nie musi być jakoś specjalnie mocny, ale warto by było aby był lepszy niż rand(). Jest takie coś?

- Rejestracja:ponad 21 lat
- Ostatnio:około 11 godzin
rozwiązanie na szybko, prawdopodobnie tragicznie niewydajne:
// zwraca liczbę pseudolosową dodatnią z zakresu 0 .. 2^63-1
__int64 rand64()
{
return (((__int64)rand()&7)<<60) |
((__int64)rand()<<45) |
((__int64)rand()<<30) |
((__int64)rand()<<15) |
(__int64)rand();
}

- Rejestracja:ponad 21 lat
- Ostatnio:około 11 godzin
rincewind napisał(a)
To rozwiązanie zmniejsza entropię pięciokrotnie. Ergo: rozwiązanie pięć razy gorsze od rand() (pięciokrotnie mniejszy cykl generatora).
Pięciokrotnie wolniejsze, to na pewno. Ale jeśli długość cyklu rand()a nie jest podzielna przez 5, to nie będzie krótszego cyklu.
Co do entropii — w zastosowaniach, gdzie się naprawdę liczy, stosuje się szum termiczny, rozpad nuklearny lub inne zjawiska, a nie odpala rand() ...

- Rejestracja:prawie 15 lat
- Ostatnio:około 12 lat
zerknij sobie tu http://en.wikipedia.org/wiki/Linear_feedback_shift_register
Jest tam link do pdf-a, w którym znajdują się wielomiany dla rejestrów do długości 168.
- Rejestracja:około 18 lat
- Ostatnio:ponad 12 lat
__int64 r64state;
__int64 r64mask;
__int64 random64()
{
r64state = (r64state >> 1) ^ (-(r64state & 1) & r64mask);
return r64state;
}
void setmask64(__int64 new_mask)
{
r64mask = new_mask;
}
void setseed64(__int64 seed)
{
r64state = seed;
}
Wykodziłem na sucho (na tym kompie nie ma kompilatora), przerobiłem trochę przykład z angielskiej wikipedii. Tylko tam było na unsigned, a martwi mnie kod
-(r64state & 1)
To zadziała tak jak jest czy trzeba wszystkie zmienne przerobić na unsigned?
- Rejestracja:prawie 16 lat
- Ostatnio:ponad 11 lat
Azarien napisał(a)
Hmm. Według standardu, rand() zwraca liczbę z zakresu 0..MAX_RAND, a MAX_RAND u mnie pod gcc (mingw32) wynosi 32767...
MinGW korzysta z microsoftowej biblioteki standardowej, a nie glibc (AFAIR glibc się dosyć mocno nie lubi z Windowsem).
Zarejestruj się i dołącz do największej społeczności programistów w Polsce.
Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.