Problemem jest dodatek. rand()
zwraca int
wartość 0...RAND_MAX
. Więc jeśli dodasz dwa z nich, wstaniesz RAND_MAX * 2
. Jeśli to przekracza INT_MAX
, wynik dodania przepełnia prawidłowy zakres, jaki int
może utrzymać. Przepełnienie podpisanych wartości jest nieokreślonym zachowaniem i może prowadzić do tego, że klawiatura mówi do ciebie obcymi językami.
Ponieważ dodawanie dwóch losowych wyników nie przynosi korzyści, prostym pomysłem jest po prostu nie robienie tego. Alternatywnie możesz rzucić każdy wynik na unsigned int
przed dodaniem, jeśli może to pomieścić sumę. Lub użyj większego typu. Pamiętaj, że long
niekoniecznie jest szerszy niż int
, to samo dotyczy, long long
jeśli int
ma co najmniej 64 bity!
Wniosek: po prostu unikaj dodawania. Nie zapewnia większej „losowości”. Jeśli potrzebujesz więcej bitów, możesz połączyć wartości sum = a + b * (RAND_MAX + 1)
, ale prawdopodobnie również wymaga to większego typu danych niż int
.
Jako podany powód należy unikać wyniku zerowego: nie można tego uniknąć przez dodanie wyników dwóch rand()
wywołań, ponieważ oba mogą być zerowe. Zamiast tego możesz po prostu zwiększyć. Jeśli RAND_MAX == INT_MAX
nie można tego zrobić w int
. Jednak (unsigned int)rand() + 1
zrobi to bardzo, bardzo prawdopodobne. Prawdopodobnie (nie definitywnie), ponieważ wymaga UINT_MAX > INT_MAX
, co jest prawdą we wszystkich implementacjach, o których wiem (co obejmuje całkiem sporo wbudowanych architektur, DSP i wszystkich platform stacjonarnych, mobilnych i serwerowych z ostatnich 30 lat).
Ostrzeżenie:
Mimo, że zostało już tutaj pokropionych komentarzami, należy pamiętać, że dodanie dwóch losowych wartości nie daje jednolitego rozkładu, ale rozkład trójkątny, taki jak rzucenie dwiema kościami: aby uzyskać 12
(dwie kości) obie kości muszą się pokazać 6
. ponieważ 11
istnieją już dwa możliwe warianty: 6 + 5
lub 5 + 6
itd.
Tak więc dodanie jest również złe w tym aspekcie.
Zauważ też, że rand()
generowane wyniki nie są od siebie niezależne, ponieważ są generowane przez generator liczb pseudolosowych . Należy również zauważyć, że standard nie określa jakości ani jednolitego rozkładu obliczonych wartości.
rand()
nie może być negatywne ...