Std:: default_random_engine генерирует значения между 0.0 и 1.0
Я хочу иметь возможность генерировать случайные значения между 0.0 и 1.0
Я пытался использовать
std::default_random_engine generator;
std::uniform_real_distribution<float> distribution(0.0, 1.0);
float myrand = distribution(generator);
Генерация случайного значения в цикле всегда дает мне следующие значения:
0.000022
0.085032
0.601353
0.891611
0.967956
0.189690
0.514976
0.398008
0.262906
0.743512
0.089548
Что я могу сделать, чтобы действительно получить случайные значения?
Не кажется случайным, если я всегда получаю те же самые.
Ответы
Ответ 1
// 1-st variant: using time() function for seed random distribution
std::default_random_engine generator(time(0));
std::uniform_real_distribution<double> distribution(first, last);
return distribution(generator);
/*disadvantages:
если открытые многократные программы, которые используют один и тот же генератор случайных чисел
они будут давать те же результаты, потому что они имеют одинаковое значение семени, которое является временем.
Эта проблема решена с помощью случайного устройства, см. Описание за пределами: */
// 2-nd variant:
std::uniform_real_distribution<double> distribution(first, last);
std::random_device rd;
std::default_random_engine generator( rd() );
return distribution(generator);
Ответ 2
Если вы ссылаетесь на то, что вы получаете одинаковые результаты для каждого исполнения программы, это потому, что вам нужно предоставить семя, основанное на некотором естественном случайном значении (например, какой-либо номер ввода пользователем или число миллисекунды, прошедшие с момента включения компьютера или с 1 января 1970 года и т.д.):
#include <random>
std::default_random_engine generator;
generator.seed( /* ... */ );
// ^^^^^^^^^
// Provide some naturally random value here
std::uniform_real_distribution<float> distribution(0.0, 1.0);
float myrand = distribution(generator);
Ответ 3
Я нашел еще одно хорошее решение...
double Generate(const double from, const double to)
{
std::random_device rd;
return std::bind(
std::uniform_real_distribution<>{from, to},
std::default_random_engine{ rd() })();
}