Найти в Дзене

Случайные числа в программировании на С++

Почти во всех языках программирования имеются встроенные функции для генерации случайных чисел. И, конечно же, именно их и следует использовать. Однако уверен, что кому-то наверняка будет любопытно попробовать создать такой генератор самостоятельно. К тому же он может пригодиться в языках, где встроенных функций генерации случайных чисел нет (например, их нет в языках программирования ПЛК).

Итак, вот вам пример такой функции на С++:

void randomize(int z, unsigned int& x)
{
x = 0x3FFFFFFF & (0x41C64E6D * x + z) % 0x80000000;
}

Через параметр z передаётся некое начальное число, от которого будет “плясать” наш генератор. Через параметр х передаётся текущее значение х и возвращается значение - “случайное” число. Я не зря заключил слово “случайное” в кавычки, потому что результат будет, как вы понимаете, не совсем случайным.

Суть в том, чтобы через параметр х в функцию также передавалось НЕ одинаковое значение, иначе возвращать функция будет всегда одно и то же число.

Такая функция называется линейным конгруэнтным генератором - генератором случайных чисел примитивного типа. Это простейший (примитивный) вид генераторов такого рода, однако во многих случаях его возможностей вполне достаточно.

Вот пример программы и вывода полученных случайных значений на С++:

Как видите, числа выводятся действительно разные. Однако сколько бы раз вы не запускали программу, вы всегда получите один и тот же набор чисел. Это всё потому, что для генерации случайного числа мы всегда используем одно и то же число (12345), которое передаётся через первый параметр в функцию randomize.

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

Сделать это можно, например, так:

randomize(time(0), n);

Если компилятор будет ругаться, то подключите ctime:

#include <ctime>

Ну и да - это будет работать и на других языках, только, разумеется, надо будет переписать код на другом языке (и не говорите мне, что я “Капитан Очевидность”, просто я учитываю то, что читать эту статью могут и совсем начинающие))).

На этом всё. Подписывайтесь на канал, чтобы ничего не пропустить.

Наука
7 млн интересуются