Potrzebuję funkcji, która wygeneruje losową liczbę całkowitą w podanym zakresie (w tym wartości graniczne). Nie mam nieuzasadnionych wymagań dotyczących jakości / losowości, mam cztery wymagania:
- Potrzebuję tego, żeby był szybki. Mój projekt musi generować miliony (a czasem nawet dziesiątki milionów) liczb losowych, a moja obecna funkcja generatora okazała się wąskim gardłem.
- Potrzebuję, aby był w miarę jednolity (użycie rand () jest całkowicie w porządku).
- zakresy min-max mogą wynosić od <0, 1> do <-32727, 32727>.
- musi być zaszczepiany.
Obecnie mam następujący kod w C ++:
output = min + (rand() * (int)(max - min) / RAND_MAX)
Problem w tym, że nie jest tak naprawdę jednolity - max jest zwracany tylko wtedy, gdy rand () = RAND_MAX (dla Visual C ++ jest to 1/32727). Jest to poważny problem w przypadku małych zakresów, takich jak <-1, 1>, gdzie ostatnia wartość prawie nigdy nie jest zwracana.
Więc złapałem długopis i papier i wymyśliłem następującą formułę (która opiera się na sztuczce zaokrąglania liczb całkowitych (int) (n + 0,5)):
Ale to nadal nie daje mi jednolitej dystrybucji. Powtarzane serie z 10000 próbek dają mi stosunek 37:50:13 dla wartości -1, 0,1.
Czy mógłbyś zaproponować lepszą formułę? (lub nawet cała funkcja generatora liczb pseudolosowych)