Генерація випадкових чисел

У багатьох задачах потрібні послідовності чисел, що належать певній множині, але більше ніяк не пов’язані одне з одним. Такі числа називаються випадковими. Послідовності випадкових чисел часто імітують, використовуючи генератор псевдовипадкових чисел – підпрограму, яка за певним алгоритмом утворює послідовність чисел, що виглядає випадковою.

В С++  послідовності випадкових чисел можна утворити за допомогою функції rand(), оголошеної у  бібліотеці <cstdlib>.

Функція rand()  обчислює і повертає  наступне псевдовипадкове значення на основі формули з деяким початковим значенням seed.  Усі значення є цілими числами в діапазоні від 0 до 32767. Число 32767 позначається константою RAND_MAX, яку теж оголошено у бібліотеці <cstdlib>.

Приклад. Згенерувати три випадкових числа.

Результат роботи програми:

В більшості випадків такий великий діапазон не потрібен. Для того, щоб масштабувати інтервал генерації чисел необхідно скористатися операцією знаходження остачі від ділення  %:

Яким би не було число, згенероване функцією rand() та дільник range, остача від ділення завжди буде менша за дільник, тобто в змінну number запишеться число в діапазоні від 0 до range-1.

Для того, щоб зсунути діапазон необхідно додати число, яке буде початком діапазону:

В змінну number запишеться число в діапазоні від firstNumber до firstNumber + range - 1.  Тобто, firstNumber  – це початок діапазону, а range – його ширина, яку можна розрахувати наступним чином: range = lastNumber - firstNumber+1, де lastNumber – останнє число в діапазоні:

Наприклад, для того, щоб згенерувати число в діапазоні  від 1 до 10 необхідно  використати  вираз  1+rand()%10, вираз 5+rand()%11 генерує число в діапазоні від 5 до 15 , -10+rand()%21 число від -10 до 10 .

Функція rand() один раз генерує числа, а при наступних запусках програми відображає  ті ж самі. Така особливість функції необхідна для того, щоб можна було правильно налагодити програму. При налагодженні програми, якщо вносяться якісь зміни, необхідно впевнитися, що програма працює правильно, а це можливо тільки якщо вхідні дані ті самі. Коли програма успішно налагоджена необхідно, щоб при кожному виконанні програми генерувалися різні числа. Для цього необхідно скористатися функцією srand() з тієї ж стандартної бібліотеки С++.

Функція srand() встановлює значення числа seed, для якої функція rand() генерує відповідну послідовність, використовуючи для цього аргумент у виклику (невід’ємне ціле число). Якщо в якості аргументу використовувати одне й теж саме число, то функція rand() буде постійно генерувати одну й ту саму послідовність.

Функцію  srand() достатньо викликати один раз на початку програми.

Наприклад, згенеруємо три випадкових числа, встановивши значення seed в аргументі функції srand() рівним 5:

Програма постійно буде генерувати наступну послідовність:

Якщо замінити значення аргументу функції srand()на число 8, то буде генеруватися вже нова послідовність:

Щоб кожен раз генерувалися нові випадкові числа необхідно, щоб мінявся аргумент у функції srand().  Щоб автоматично змінювати аргумент функції, можна використати функцію time() з бібліотеки <ctime>, що повертає значення поточного календарного часу (кількість секунд, що пройшла з 00:00 1 січня 1970 року). Щоб не зберігати значення, яке повертає функція time() її аргумент задається значенням NULL:

При кожному запуску цієї програми щоразу будуть генеруватися нові числа.

Увага! Функція rand() утворює псевдовипадкові послідовності за заданим алгоритмом,  які є досить передбачуваними, тому її не можна використовувати в криптографії.

 

1+

Залишити відповідь

Ваша e-mail адреса не оприлюднюватиметься. Обов’язкові поля позначені *