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() })();
}