Назад Зміст Вперед

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

У C++ існує кілька способів генерації випадкових чисел. Розглянемо основні методи.

1. Функція rand() з бібліотеки cstdlib

#include <iostream>
#include <cstdlib>  // для rand() і srand()
#include <ctime>    // для time()

using namespace std;

int main()
{
    // Ініціалізація генератора випадкових чисел
    srand(time(0));  // Використовуємо поточний час як seed
    
    // Генерація випадкового числа від 0 до RAND_MAX
    int random1 = rand();
    cout << "Випадкове число: " << random1 << endl;
    
    // Генерація числа у діапазоні від 1 до 100
    int random2 = rand() % 100 + 1;
    cout << "Число від 1 до 100: " << random2 << endl;
    
    return 0;
}

Пояснення:

Важливо!

rand() генерує псевдовипадкові числа, які не є криптографічно стійкими. Для серйозних додатків використовуйте <random> (C++11).

2. Сучасний спосіб (C++11) - бібліотека <random>

#include <iostream>
#include <random>  // Сучасний генератор випадкових чисел

using namespace std;

int main()
{
    // Ініціалізація генератора
    random_device rd;  // Використовуємо апаратний генератор
    mt19937 gen(rd()); // Вибір алгоритму (Mersenne Twister)
    
    // Визначення діапазону
    uniform_int_distribution<int> dist(1, 100);  // Цілі числа від 1 до 100
    uniform_real_distribution<double> dist_real(0.0, 1.0);  // Дійсні числа
    
    // Генерація чисел
    cout << "Ціле число: " << dist(gen) << endl;
    cout << "Дійсне число: " << dist_real(gen) << endl;
    
    return 0;
}

Переваги <random>:

3. Приклади розподілів

Тип розподілу Приклад коду Опис
Рівномірний (цілі числа) uniform_int_distribution<int> dist(1, 6); Імітація кидання кубика (1-6)
Рівномірний (дійсні числа) uniform_real_distribution<double> dist(0.0, 1.0); Числа від 0.0 до 1.0
Нормальний розподіл normal_distribution<double> dist(5.0, 2.0); Середнє 5.0, стандартне відхилення 2.0

4. Практичний приклад

#include <iostream>
#include <random>
#include <ctime>

using namespace std;

int main()
{
    // Старий спосіб (не рекомендується)
    srand(time(0));
    cout << "Старий спосіб: " << rand() % 10 << endl;
    
    // Сучасний спосіб (C++11)
    random_device rd;
    mt19937 gen(rd());
    uniform_int_distribution<int> dist(1, 49);
    
    cout << "Лотерейне число: " << dist(gen) << endl;
    
    // Генерація кольору RGB
    uniform_int_distribution<int> color(0, 255);
    cout << "Випадковий колір: RGB(" 
         << color(gen) << ", " 
         << color(gen) << ", " 
         << color(gen) << ")" << endl;
    
    return 0;
}

Поради:

  1. Для нових проектів використовуйте <random>
  2. Для простих задач підійде rand(), але не забувайте про srand()
  3. Для криптографії використовуйте спеціалізовані бібліотеки
  4. Уникайте генерації seed з часу у серйозних додатках

Назад Зміст Вперед