Генератор випадкових чисел rand() С++
Випадкові числа в мові програмування С можуть бути згенеровані функцією rand() зі стандартної бібліотеки С++. Функція rand() генерує числа від 0 до RAND_MAX . RAND_MAX — константа, визначена в бібліотеці . Для MVS RAND_MAX = 32767, але може бути й більше, залежно від компілятора. Нижче показана проста програма, що використовує генератор випадкових чисел rand() (див. малюнок 1).
// random.cpp: визначає точку входу для консольної програми. #include "stdafx.h" #include using namespace std; int main(int argc, char* argv[]) < cout
У рядку 9 значення константи RAND_MAX виштовхується в потік виведення, тому ми зможемо подивитися максимальне значення з інтервалу випадкових чисел. У рядку 10 запускається генератор випадкових чисел rand() , причому він згенерує випадкове число один раз при першому запуску програми. Надалі, скільки б Ви не запускали цю програму, згенероване число залишиться тим самим.
Малюнок 1 - Генератор випадкових чисел rand()
Як видно з рисунку 1, максимальне випадкове число — це 32767. Функція rand() згенерувала число 41. Найчастіше, нам не потрібен такий великий діапазон чисел від 0 до RAND_MAX . Наприклад, у грі «Наперстки» необхідно відгадати, під яким із трьох наперсток захована кулька, тобто генерація чисел повинна виконуватися в межах від 1 до 3-х. Кидаючи монету, може виникнути лише два випадки, коли монета впаде «орлом» або «решкою» вгору, потрібний інтервал — від 1 до 2. Виникає потреба в масштабуванні інтервалу генерації випадкових чисел. Для того, щоб масштабувати інтервал генерації чисел потрібно скористатися, операцією знаходження залишку від поділу.%«.
// приклад масштабування діапазону генерації випадкових чисел rand() % 3 +1 // діапазон дорівнює від 1 до 3 включно
Число 3 є коефіцієнтом, що масштабується. Тобто, яке б не видав число генератора випадкових чисел rand() запис rand() % 3 у результаті видасть число з діапазону від 0 до 2. Для того щоб змістити діапазон, ми додаємо одиницю, тоді діапазон зміниться на такий — від 1 до 3 включно.
// Формула генерації випадкових чисел за заданим діапазоном random_number = firs_value + rand() % last_value; // де firs_value – мінімальне число з бажаного діапазону // last_value – ширина вибірки
Розробимо програму, яка використовує масштабований генератор випадкових чисел. Нижче наведено код програми, яка кілька разів запускає функцію rand() .
// rand_ost.cpp: визначає точку входу для консольної програми. #include "stdafx.h" #include using namespace std; int main(int argc, char* argv[]) < cout
Починаючи з 9-й по 16-й рядок , включно виконується запуск генератора випадкових чисел rand() . У цій програмі 8 разів було запущено генератор випадкових чисел rand() з метою виявлення випадковості спрацьовування. Функція rand() виконується з масштабуванням, причому мінімальне число бажаного діапазону дорівнює одиниці, а ширина вибірки дорівнює 3-м. Таким чином, наш діапазон від 1 до 3 включно. Результат роботи програми (див. рисунок 2).
Малюнок 2 - Генератор випадкових чисел rand()
З малюнка 2 видно, що генератор випадкових чисел rand() було запущено 8 разів. Із восьми разів:
- трійка здалася тричі, P = 3/8 = 0.375 - ймовірність появи трійки
- двійка здалася тричі, P = 3/8 = 0.375 - ймовірність появи двійки
- одиниця здалася двічі, P = 2/8 = 0.25 - ймовірність появи одиниці
Всі ці ймовірності приблизні, тому що випробування проводилося лише 8 разів, якщо ви спробуєте у себе скомпил цей код, то результат може вийти зовсім інший.
При повторному запуску програми друкуються ті самі числа. Суть у тому, що функція rand() один раз генерує випадкові числа, а при наступних запусках програми лише відображає згенеровані вперше числа. Така особливість функції rand() потрібна для того, щоб можна було правильно налагодити програму, що розробляється. При налагодженні програми, внісши якісь зміни, необхідно переконатися, що програма спрацьовує правильно, а це можливо, якщо вхідні дані залишилися ті ж, тобто згенеровані числа. Коли програма успішно налагоджена, потрібно, щоб у кожному виконанні програми генерувалися випадкові числа. Для цього потрібно скористатися функцією srand() із стандартної бібліотеки С++. Функція srand() отримавши цілий позитивний аргумент типу unsigned або unsigned int (без знакового цілого) виконує рандомізацію таким чином, щоб при кожному запуску програми функція srand() генерувала випадкові числа. Програма, що використовує функцію srand() для рандомізації генератора випадкових чисел rand() (див. рисунок 3).
// srand.cpp: визначає точку входу для консольної програми. #include "stdafx.h" #include using namespace std; int main(int argc, char* argv[]) < unsigned rand_value = 11; srand (rand_value); // Рандомізація генератора випадкових чисел cout
У рядку 10 виконується функція srand() , яка приймає як аргумент ціле позитивне число 11. При першому запуску ми отримали випадкові числа, і за наступних запусках програми бачимо ті самі числа.Так от, щоб щоразу генерувалися нові випадкові числа потрібно, щоб змінювався аргумент на функції srand() . На наступних малюнках наочно можна подивитися як змінюються згенеровані числа щодо змінного значення в змінній rand_value (див. Рисунки 3 і 4 ).
Малюнок 3 - Генератор випадкових чисел rand()
Малюнок 4 - Генератор випадкових чисел rand()
З малюнків 3 і 4 видно, що з зміні значення rand_value змінюються числа, причому у першому і другому запусках функції rand() . Те, що на малюнку 4 в першому випадку залишилося таке ж випадкове число, - це збіг.
І нарешті, щоб робити рандомізацію автоматично, тобто, не змінюючи кожного разу аргумент у функції srand(), потрібно скористатися функцією time() з аргументом 0.
// автоматична рандомізація srand (time (0));
Щоб використовувати функцію time(), необхідно підключити заголовний файл.
Розробимо узагальнений приклад використання автоматичного генератора випадкових чисел із масштабуванням. Приклад роботи програми (див. рис. 5).
// srand_time.cpp: визначає точку входу для консольної програми. #include "stdafx.h" #include #include using namespace std; int main (int argc, char * argv []) < srand (time (0)); // автоматична рандомізація cout
Тепер при кожному спрацьовуванні програми будуть генеруватися випадкові числа в інтервалі від 1 до 10, включно (див. Рисунок 5).
Малюнок 5 - Генератор випадкових чисел rand()
Функція rand у C++: генерація випадкових чисел
Привіт! У цій статті йдеться про популярну функцію в C++ для генерації випадкових чисел - rand. Почнемо ми з огляду на цю функцію і розберемося, як її правильно використовувати. Подивимося як ця функція поводиться на декількох прикладах, а закінчимо написанням свого простенького генератора випадкових чисел.
Як згенерувати випадкове число C++
Для генерації випадкових чисел C/C++ можна використовувати функцію rand :
- Ця функція не приймає жодних аргументів.
- Ця функція повертає випадкове число від нуля до RAND_MAX (залежить від компілятора. У мене RAND_MAX = 2147483647 ).
Давайте подивимося на просту програму, яка виводить випадкові числа, що згенеровані за допомогою функції rand :
#include
using
namespace std;
int
main()
cout
<"rand() token operator"> <rand()
<>; cout
<"rand() token operator"> <rand()
<>; cout
<"rand() token operator"> <rand()
<>;
return
0;
>
І тепер давайте запусти її:
rand() = 16807 rand() = 282475249 rand() = 1622650073
rand() = 16807 rand() = 282475249 rand() = 1622650073
Хм ... Якісь випадкові числа не дуже випадкові. Справа в тому, що ми працюємо з псевдовипадковими числами. Ці числа обчислюються за математичною формулою і виглядають випадковими. Насправді, кожне наступне число залежить від попереднього. Як ви вже можете здогадатися, при старті програми це стартове число те саме.
Давайте змінимо цей seed (стартове число) при старті програми, щоб випадкові числа були різні при кожному запуску:
#include
#include
using
namespace std;
int
main()
srand(time(0)); cout
<"rand() token operator"> <rand()
<>; cout
<"rand() token operator"> <rand()
<>; cout
<"rand() token operator"> <rand()
<>;
return
0;
>
rand() = 871916998 rand() = 2028061905 rand() = 775992151
rand() = 871849770 rand() = 898160909 rand() = 727842800
Так краще. Звичайно, використовувати time(0) зовсім не обов'язково. Ви можете вибрати seed як вам завгодно.
Генерація випадкових чисел у діапазоні
Просто випадкове число нам потрібне досить рідко. Зазвичай ми хочемо отримати число, яке перебуватиме в якомусь діапазоні (наприклад, від десяти до двадцяти включно).Для цього є стандартний прийом із залишком від поділу та додаванням:
int start =
10;
int end =
20;
int x =
rand()
%
(end - start +
1)
+ start;
Як ви можете бачити, ми спочатку "обрізаємо" згенероване число до потрібного нам розміру за допомогою залишку від розподілу, а потім зрушуємо його так, щоб 0 став до початку діапазону.
Що буде виведено на екран:
int start =
10;
int end =
30;
int x =
rand()
%
(end - start +
1)
+ start; cout x endl;
Проста реалізація генератора випадкових чисел
Тепер давайте спробуємо реалізувати генератор випадкових чисел не використовуючи бібліотечних функцій на кшталт rand:
#include
#include
using
namespace std;
unsigned
long seed =
1;
// це те саме стартове значення,
// Про яке ми говорили раніше
int
my_rand()
seed = seed *
1103515245
+
12345;
// Лінійний конгруентний метод
return
(seed /
65536)
%
32768;
// Повернути значення в діапазоні 0-32767
>
int
main()
cout
<"my_rand() token operator"> <my_rand()
<>; cout
<"my_rand() token operator"> <my_rand()
<>; cout
<"my_rand() token operator"> <my_rand()
<>;
return
0;
>
my_rand() = 16838 my_rand() = 5758 my_rand() = 10113
Вітаю! Ви реалізували свій власний найпростіший генератор випадкових чисел!
- Використання функції rand :
Напишіть програму на C++, яка генерує три випадкові числа за допомогою функції rand і виводить їх на екран. Потім змініть програму так, щоб вона використовувала time(0) як seed'a і знову виведіть три випадкові числа.
- Генерація випадкових чисел у діапазоні:
Використовуючи приклад у статті, напишіть програму, яка генерує три випадкові числа в діапазоні від 50 до 100 і виводить їх на екран. Потім змініть програму так, щоб діапазон був від -100 до 100.
- Створення свого генератора випадкових чисел:
Використовуючи приклад у статті, створіть свою версію функції rand. Ваша програма повинна генерувати три випадкові числа за допомогою вашої функції та виводити їх на екран.
Якщо хочете завжди бути в курсі останніх новин у світі програмування та IT, підписуєтеся на мій Telegram-канал, де я поділяюся свіжими статтями, новинами та корисними порадами. Радий бачити вас серед передплатників!
Читайте також
Функція atoi дозволяє отримати число рядка. У цій статті ви дізнаєтесь, як використовувати цю функцію, можливі проблеми, а також реалізуєте аналог цієї функції самі. Закріпити вивчений матеріал нам допоможуть вправи наприкінці статті.
У цьому уроці ви познайомитеся з функцією log C++. Ця функція дозволяє нам отримати натуральний логарифм числа. Ми розберемося з тим, як працює функція log в теорії та закріпимо вивчене на практиці.
Функція exp використовується в мовах C та C++ для обчислення експонентів. У статті буде розібрано приклади використання цієї функції. Також наприкінці статті є вправи.
Функція strlen використовується в мові програмування C для розрахунку кількості символів у рядку. У статті буде розібрано приклади використання цієї функції. Також ми реалізуємо цю функцію самі, а наприкінці статті є вправи для закріплення матеріалу.
Функція strcat використовується мовами C і C++ для з'єднання (конкатенації) рядків. У статті буде розібрано приклади використання цієї функції. Також наприкінці статті є вправи.
Функція snprintf використовується у мовах C і C++ для форматування рядка без виведення на екран. У статті буде розібрано приклади використання цієї функції. Також наприкінці статті є вправи.
Функція puts використовується в мові програмування C для виведення рядка на екран, використовуючи стандартний висновок.У статті буде розібрано приклади використання цієї функції. Також ми реалізуємо цю функцію самі, а наприкінці статті є вправи для закріплення матеріалу.
Функція printf - це швейцарський ніж для виведення на консоль C/C++. Через це ця функція підтримує величезну кількість різних прапорів та модифікаторів для стилізації виведення як вам завгодно. У цій статті ми розберемося на прикладах, як їй, все-таки, користуватися.
Функція sqrt використовується в мовах C і C++ для обчислення квадратного кореня числа. У статті буде розібрано приклади використання цієї функції. Також наприкінці статті є вправи.