У багатьох задачах потрібні послідовності чисел, що належать певній множині, але більше ніяк не пов’язані одне з одним. Такі числа називаються випадковими. Послідовності випадкових чисел часто імітують, використовуючи генератор псевдовипадкових чисел – підпрограму, яка за певним алгоритмом утворює послідовність чисел, що виглядає випадковою.
В С++ послідовності випадкових чисел можна утворити за допомогою функції rand()
, оголошеної у бібліотеці <cstdlib>
.
Функція rand()
обчислює і повертає наступне псевдовипадкове значення на основі формули з деяким початковим значенням seed
. Усі значення є цілими числами в діапазоні від 0 до 32767. Число 32767 позначається константою RAND_MAX
, яку теж оголошено у бібліотеці <cstdlib>
.
Приклад. Згенерувати три випадкових числа.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
#include <iostream> #include <cstdlib> using namespace std; int main() { int number1, number2, number3; number1 = rand(); number2 = rand(); number3 = rand(); cout << "Random number 1 = "<< number1 << endl; cout << "Random number 2 = " << number2 << endl; cout << "Random number 3 = " << number3 << endl; return 0; } |
Результат роботи програми:
В більшості випадків такий великий діапазон не потрібен. Для того, щоб масштабувати інтервал генерації чисел необхідно скористатися операцією знаходження остачі від ділення %
:
1 |
number = rand () % range |
Яким би не було число, згенероване функцією rand()
та дільник range
, остача від ділення завжди буде менша за дільник, тобто в змінну number
запишеться число в діапазоні від 0
до range-1
.
Для того, щоб зсунути діапазон необхідно додати число, яке буде початком діапазону:
1 |
number = firstNumber + rand () % range |
В змінну 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:
1 2 3 4 5 6 7 8 |
int number1, number2, number3; srand(5); number1 = 1 + rand()%10; number2 = 1 + rand() % 10; number3 = 1 + rand() % 10; cout << "Random number 1 = "<< number1 << endl; cout << "Random number 2 = " << number2 << endl; cout << "Random number 3 = " << number3 << endl; |
Програма постійно буде генерувати наступну послідовність:
Якщо замінити значення аргументу функції srand()
на число 8, то буде генеруватися вже нова послідовність:
Щоб кожен раз генерувалися нові випадкові числа необхідно, щоб мінявся аргумент у функції srand()
. Щоб автоматично змінювати аргумент функції, можна використати функцію time()
з бібліотеки <ctime>
, що повертає значення поточного календарного часу (кількість секунд, що пройшла з 00:00 1 січня 1970 року). Щоб не зберігати значення, яке повертає функція time()
її аргумент задається значенням NULL
:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
#include <iostream> #include <cstdlib> //підключення бібліотеки з функціями rand() і srand() #include <ctime> //підключення бібліотеки з функцією time() using namespace std; int main() { srand(time(NULL)); //запуск генератора випадкових чисел зі значенням seed = time(NULL) int number1, number2, number3; //генерація випадкових чисел в діапазоні від 1 до 10 number1 = 1 + rand()%10; number2 = 1 + rand() % 10; number3 = 1 + rand() % 10; //виведення чисел cout << "Random number 1 = "<< number1 << endl; cout << "Random number 2 = " << number2 << endl; cout << "Random number 3 = " << number3 << endl; return 0; } |
При кожному запуску цієї програми щоразу будуть генеруватися нові числа.
Увага! Функція rand() утворює псевдовипадкові послідовності за заданим алгоритмом, які є досить передбачуваними, тому її не можна використовувати в криптографії.