У багатьох задачах потрібні послідовності чисел, що належать певній множині, але більше ніяк не пов’язані одне з одним. Такі числа називаються випадковими. Послідовності випадкових чисел часто імітують, використовуючи генератор псевдовипадкових чисел – підпрограму, яка за певним алгоритмом утворює послідовність чисел, що виглядає випадковою.
В С++ послідовності випадкових чисел можна утворити за допомогою функції 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() утворює псевдовипадкові послідовності за заданим алгоритмом, які є досить передбачуваними, тому її не можна використовувати в криптографії.