Поиск по сайту:

Как создать генератор случайных чисел на C++


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

Генератор случайных чисел является основой для создания псевдослучайных чисел.

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

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

Функция srand() в C++ может выполнять вычисление псевдослучайных чисел. Эта функция требует начального значения, которое формирует основу для вычисления случайных чисел.

srand(unsigned int seed_value)

С помощью начального значения srand() создает основу для генерации псевдослучайных чисел функцией rand().

int random = rand();

И вуаля! Мы выполнили простую задачу генерации случайного числа. Однако самое сложное — понять концепцию генераторов случайных чисел.

Важность начального значения

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

Начальное значение по умолчанию для функции srand() равно 1, поэтому вызов функции rand() без указания нового начального значения все равно принесет нам строку случайных чисел. Проблема здесь в том, что каждый раз, когда вы запускаете программу с начальным значением, вывод останется прежним.

Простое решение нашей проблемы — использовать новое начальное значение каждый раз, когда мы запускаем программу. Что меняется каждую секунду? - Время. Мы использовали концепцию текущей метки времени как текущего начального значения.

Вы можете создать метку времени, используя:

time_t current_time = time(NULL);

Переменная current_time содержит количество секунд, прошедших с января 1970 года. Это значение передается функции srand(), после чего мы получаем новую последовательность псевдослучайных чисел. .

Мы можем пропустить инициализацию временной метки в переменной и просто передать временную метку в функцию.

srand((unsigned) time(NULL));

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

Создание идеального генератора случайных чисел на C++

Следующий код демонстрирует правильную генерацию случайного числа.

#include<iostream>
#include<cstdlib>
using namespace std;

int main(){

	// Providing a seed value
	srand((unsigned) time(NULL));

	// Get a random number
	int random = rand();

	// Print the random number
	cout<<random<<endl;

	return 1;
}

Выход:

1897776064

Сгенерированное число слишком велико для правильного использования в обычных вычислениях.

Генерация случайных чисел в диапазоне

Необходимо ограничить случайные числа определенным диапазоном. Для этой конкретной цели мы используем оператор модуля %.

Например, для генерации случайных чисел от 0 до 9 мы можем использовать:

int random = rand() % 10;

Точно так же, если нам нужно получить случайные числа от 1 до 9, мы используем:

int random = 1 + (rand() % 9);

Общее уравнение может быть сформулировано как:

int random = offset + (rand() % range);

В приведенном выше уравнении:

  • смещение – начальная точка диапазона случайных чисел.
  • диапазон – количество значений между первым и последним возможным случайным числом, включая ограничения.

Например, в наборе случайных чисел от 10 до 100 у нас есть смещение 10 и диапазон 91.

Давайте запустим пример программы, которая печатает 5 случайных чисел от 100 до 200.

#include<iostream>
#include<cstdlib>
using namespace std;

int main(){

	// Providing a seed value
	srand((unsigned) time(NULL));

	// Loop to get 5 random numbers
	for(int i=1; i<=5; i++){
		
		// Retrieve a random number between 100 and 200
		// Offset = 100
		// Range = 101
		int random = 100 + (rand() % 101);

		// Print the random number
		cout<<random<<endl;
	}

	return 1;
}

Выход:

144
175
162
137
200

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

Применение генераторов случайных чисел (ГСЧ)

Возможности генерации случайных чисел могут показаться ограниченными, но это не так. Поэтому давайте рассмотрим несколько вариантов использования ГСЧ.

Криптография

Непредсказуемость считается мерой безопасности в области криптографии. Поэтому широко используются генераторы случайных чисел, такие как ключи и одноразовые номера.

Игры

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

Рандомизированный алгоритм

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

Заключение

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

Надеемся, эта статья была понятна читателю. Не стесняйтесь комментировать ниже любые вопросы или предложения.