2014-10-19 4 views
4

я следующее:Случайные двойники всегда бесконечна

std::random_device rd; 
    std::mt19937_64 randEng(rd()); 
    std::uniform_real_distribution<double> rg(std::numeric_limits<double>::lowest(), std::numeric_limits<double>::max()); 

    for(size_t i = 0; i < numToGenerate; i++){ 
     nums[i] = rg(randEng); 
     std::cout << nums[i] << std::endl; 
    } 

Где nums вектор presized к numToGenerate

Каждый номер, который печатается, хотя говорит inf мое понимание было то, что я установил это вверх чтобы получить случайные числа между ними в этом случае -1.79769e+308 и 1.79769e+308, как это бывает на моей машине. Что я делаю неправильно здесь, в настройке этого генератора случайных чисел?

+0

Что такое 'nums'? Как вы его инициализируете? Если это вектор, вам, вероятно, нужно заранее «изменить размер()» или использовать «push_back», чтобы избежать неопределенного поведения, выписав за пределы. –

+0

Нет определения для nums. Как это определяется? –

+0

'nums' - это вектор, который имеет размер' numToGenerate' – csteifel

ответ

7

Вероятно, вычисление псевдослучайного числа включает в себя разницу (max-min). Например, чтобы вычислить случайное число между A и B простой подход был бы:

x = A + rnd*(B - A) 

где rnd случайное число в диапазоне от 0 до 1. Если вы делаете это с максимальным и минимальным значением двойной точности вы получаете потому что эта разница больше максимальной и, таким образом, станет «бесконечной».

После этого A + rnd*infinite всегда бесконечен, если rnd не равен нулю, а NaN, когда он равен нулю.