Случайное число. Генератор в C++

Возможность генерации случайных чисел необходима для работы некоторых программ, например, игр или приложений научно-статистического моделирования. В игре без рандомных событий монстры будут атаковать вас одинаково, вы будете постоянно находить одни и те же артефакты и т. д. Именно поэтому уметь генерировать случайные числа — обязанность любого программиста.

Случайные и псевдослучайные числа. В чём разница?

В реальной жизни, чтобы получить случайный результат мы кидаем кости или тасуем колоду карт. Итог будет зависеть от множества физических переменных (силы тяжести, трения, сопротивления воздуха, мастерства игрока и т. п.). Во многих смыслах мы действительно получаем случайный результат, ведь спрогнозировать его почти невозможно.

У компьютеров всё иначе. Они находятся в строго контролируемом цифровом мире, где существуют лишь два значения: правда и ложь. Именно поэтому ПК изначально создан для получения прогнозируемого результата. Следовательно, он неспособен генерировать случайные числа в полном смысле этого слова. Однако компьютер может имитировать случайность, а достигается это путём использования генераторов псевдослучайных чисел.

Что такое генератор случайных чисел?

Генератор случайных (псевдослучайных) чисел, он же ГСЧ (ГСПЧ) — это программа, принимающая начальное значение и выполняющая с этим значением ряд математических операций, что приводит к конвертации числа в другую цифру, отличную от стартовой. После этого программа применяет новое сгенерированное значение для дальнейших математических операций с последующей генерацией очередного числа, не связанного ни с первым, ни со вторым. И так далее. Таким образом, алгоритм генерирует ряд новых чисел, которые будут нам казаться действительно случайными.

Простой алгоритм случайных чисел

Написать простейший генератор случайных чисел несложно. Вот как выглядит программа на C++, которая позволяет генерировать 100 рандомных чисел:

#include <iostream>

unsigned int PRNG()
{
    // Начальное число - 4 541
    static unsigned int seed = 4541;

    // Берём начальное число и генерируем новое значение
    // Из-за применения очень больших чисел (и переполнения) угадать следующее число, исходя из предыдущего, довольно сложно
    seed = (8253729 * seed + 2396403);

    // Берём начальное число и возвращаем значение в диапазоне от 0 до 32 767
    return seed  % 32768;
}

int main()
{
    // Выводим 100 случайных чисел
    for (int count=0; count < 100; ++count)
    {
        std::cout << PRNG() << "\t";

        // Если вывели 5 чисел, вставляем символ новой строки
        if ((count+1) % 5 == 0)
            std::cout << "\n";
    }
}

А вот результат:

1-20219-fd8a25.png

Каждое число в этом ряду кажется нам случайным по отношению к предыдущему. Однако, говоря по правде, данный алгоритм достаточно примитивен.

Но зачем изобретать велосипед, когда для генерации у нас есть специальные функции?

Функции srand() и rand()

В языки программирования C и C++ встроены собственные генераторы случайных чисел. Реализованы они с помощью двух отдельных функций, которые находятся в заголовочном файле cstdlib: 1) srand(). Устанавливает значение, передаваемое пользователем, в качестве стартового. Вызывается лишь 1 раз: в начале программы (как правило, в верхней части функции main()); 2) rand(). Обеспечивает генерацию следующего случайного числа в имеющейся последовательности. Число будет находиться в промежутке от нуля до RAND_MAX (это константа в cstdlib, значение которой составляет 32 767).

Автор
0 комментариев
Для комментирования необходимо авторизоваться