В этом посте мы обсудим, как генерировать случайные значения с плавающей запятой в C++.
1. Использование std::uniform_real_distribution
Начиная с C++11, мы можем создавать равномерно распределенные значения с плавающей запятой между двумя числами с помощью std::uniform_real_distribution
. Рассмотрим следующий код, который создает высококачественные случайные значения с плавающей запятой в замкнутом интервале. [1, 10]
с использованием std::uniform_real_distribution
. Оно использует std::random_device
получить сид для стандартного mersenne_twister_engine std::mt19937
, основанный на алгоритме Mersenne Twister.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
#include <iostream> #include <random> int main() { std::random_device rd; std::mt19937 gen(rd()); std::uniform_real_distribution<> dist(1, 10); for (int i = 0; i < 100; i++) { std::cout << dist(gen) << std::endl; } return 0; } |
Обратите внимание, что в заголовке определено множество других предопределенных генераторов случайных чисел. <random>
, как указано здесь. До C++11 вы можете использовать Mersenne Twister с помощью библиотеки boost для генерации случайных значений с плавающей запятой. Например, в следующем решении используется Boost.Random
с boost::random::uniform_real_distribution
а также std::mt19937
алгоритм для генерации случайного значения с плавающей запятой в закрытом диапазоне [1, 10]
.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
#include <iostream> #include <boost/random/mersenne_twister.hpp> #include <boost/random/uniform_real_distribution.hpp> int main() { boost::random::mt19937 gen; boost::random::uniform_real_distribution<> dist(1, 10); for (int i = 0; i < 100; i++) { std::cout << dist(gen) << std::endl; } return 0; } |
2. Использование rand()
функция
Другое простое, но менее предпочтительное решение для генерации псевдослучайных чисел в C++ — это rand()
функция. Возвращает случайное число между 0
а также RAND_MAX
и может использоваться для генерации случайных значений с плавающей запятой в любом произвольном закрытом интервале. Не забудьте добавить в генератор случайных чисел srand()
перед вызовом rand()
. Оба rand()
а также srand()
функции определены в <cstdlib>
заголовок.
Например, следующее будет генерировать число с плавающей запятой в ближнем диапазоне [0, 1]
.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
#include <iostream> #include <random> #include <ctime> int main() { srand(time(NULL)); for (int i = 0; i < 100; i++) { float r = rand() / static_cast<float>(RAND_MAX); std::cout << r << std::endl; } return 0; } |
Мы можем легко расширить решение, чтобы сгенерировать произвольное значение с плавающей запятой между двумя указанными значениями. Например, выражение low + rand() * (high - low) / RAND_MAX;
генерирует случайное значение с плавающей запятой в закрытом диапазоне [low, high]
, как показано ниже:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
#include <iostream> #include <random> #include <ctime> int main() { int low = 1; int high = 10; srand(time(NULL)); for (int i = 0; i < 100; i++) { float r = low + static_cast<float>(rand()) * static_cast<float>(high - low) / RAND_MAX; std::cout << r << std::endl; } return 0; } |
Это все о генерации случайных значений с плавающей запятой в C++.