Генерация числа (0,1) с использованием Mersenne Twister Stack Overflow

Я работаю над реализацией кода R в C ++, чтобы он работал быстрее, но у меня возникли трудности с реализацией Mersenne Twister. Я только хочу генерировать значения между (0,1). Вот что я имею к этому вопросу.

#include <random>

std::mt19937 generator (123);

std::cout << "Random value: " << generator() << std:: endl;

Я попытался разделить на RAND_MAX, но это не привело к ценностям, которые я искал.

Заранее спасибо.

7

Решение

В C ++ 11 понятия «(псевдо) генератор случайных чисел» и «распределение вероятностей» разделены по понятным причинам.

То, что вы хотите, может быть достигнуто с помощью следующих строк:

  std::mt19937 generator (123);
std::uniform_real_distribution<double> dis(0.0, 1.0);

double randomRealBetweenZeroAndOne = dis(generator);

Если вы хотите понять, почему это разделение необходимо, и почему использование стандартной манипуляции делением / диапазоном на выходе генератора является плохой идеей, посмотрите это видео.

13

Другие решения

Вы можете рассмотреть такой код:

// For pseudo-random number generators and distributions
#include <random>

...

// Use random_device to generate a seed for Mersenne twister engine.
std::random_device rd{};

// Use Mersenne twister engine to generate pseudo-random numbers.
std::mt19937 engine{rd()};

// "Filter" MT engine's output to generate pseudo-random double values,
// **uniformly distributed** on the closed interval [0, 1].
// (Note that the range is [inclusive, inclusive].)
std::uniform_real_distribution<double> dist{0.0, 1.0};

// Generate pseudo-random number.
double x = dist(engine);

Для получения дополнительной информации о генерации псевдослучайных чисел в C ++ (включая причины, почему rand() является не хорошо), посмотрите это видео Стефан Т. Лававей (от Going Native 2013):

rand() Считается вредным

5

std :: mt19937 генерирует не между 0 и RAND_MAX, как rand (), но между 0 и 2 ^ 32-1

И, кстати, класс предоставляет значения min () и max ()!

Вам нужно преобразовать значение в двойное, вычесть min () и разделить на max () — min ()

uint32_t val;
val << generator;
double doubleval = ((double)val - generator::min())/(generator::max()-generator::min());

или (менее общий)

uint32_t val;
val << generator;
double doubleval = (double)val * (1.0 / std::numeric_limits<std::uint32_t>::max());
1
По вопросам рекламы [email protected]