Проблема - додавання. rand()
повертає int
значення 0...RAND_MAX
. Отже, якщо ви додасте два з них, ви отримаєте рішення RAND_MAX * 2
. Якщо це перевищує INT_MAX
, результат додавання переповнює допустимий діапазон, який int
може містити. Переповнення підписаних значень є невизначеною поведінкою і може призвести до того, що ваша клавіатура розмовлятиме з вами іноземними мовами.
Оскільки тут немає додавання двох випадкових результатів, проста ідея - просто не робити цього. Можна також подати кожен результат до unsigned int
додавання, якщо це може призвести до суми. Або використовувати більший тип. Зауважте, що long
це не обов'язково ширше, ніж int
те саме стосується, long long
якщо int
має принаймні 64 біт!
Висновок: Просто уникайте додавання. Це не забезпечує більшої "випадковості". Якщо вам потрібно більше бітів, ви можете об'єднати значення sum = a + b * (RAND_MAX + 1)
, але це також, ймовірно, вимагає більшого типу даних, ніж int
.
Оскільки вказана причина полягає у тому, щоб уникнути нульового результату: цього не уникнути, додавши результати двох rand()
дзвінків, оскільки обидва можуть бути нульовими. Натомість можна просто збільшувати. Якщо RAND_MAX == INT_MAX
цього зробити не можна int
. Однак (unsigned int)rand() + 1
зробить дуже, дуже ймовірно. Ймовірно (не остаточно), тому що це вимагає UINT_MAX > INT_MAX
, що справедливо для всіх реалізацій, про які я знаю (що охоплює досить багато вбудованих архітектур, DSP та всіх настільних, мобільних та серверних платформ за останні 30 років).
Увага:
Хоча вже посипають в коментарях тут, будь ласка , зверніть увагу , що при додаванні двох випадкових величин ніяк НЕ отримати рівномірний розподіл, а трикутний розподіл , як прокатки дві кістки: отримати 12
(дві кістки) обидві кістки повинні показати 6
. бо 11
вже є два можливі варіанти: 6 + 5
або 5 + 6
і т.д.
Отже, додаток також поганий з цього аспекту.
Також зауважте, що результати rand()
генерації не залежать один від одного, оскільки вони генеруються генератором псевдовипадкових чисел . Зауважимо також, що стандарт не визначає якість або рівномірний розподіл обчислених значень.
rand()
не може бути негативним ...