2013-09-10 1 views
1

В C++ я хочу получить случайное число с плавающей запятой. Из того, что я помню типичные генерации случайных чисел осуществляются:C++ rand() по модулю чисел с плавающей запятой

rand() % 100 

, который даст вам значение от 0 до 99

  1. То, что я хочу это rand() % PI/12

интерпретация является случайный угол между 0 и PI/12

Заранее благодарим!

+4

НЕТ! 'rand()' ужасен, и поэтому модуль в сочетании с ним! [Смотрите этот хороший разговор.] (Http://channel9.msdn.com/Events/GoingNative/2013/rand-Considered-Harmful) – chris

+0

Используйте [''] (http://en.cppreference.com/w/ cpp/numeric/random) с равномерным реальным распределением. – WhozCraig

ответ

4

Используя решение на C++ 11 <random> может выглядеть примерно так:

#include <random> 
#include <iostream> 

int main() 
{ 
    const int length = 60; 
    std::random_device rd; 
    std::mt19937_64 mt(rd()); 
    std::uniform_real_distribution<double> distribution(0, M_PI/12); 
    for(int i = 0; i < length; i++) 
    { 
     double d = distribution(mt); 
    std::cout << "d = " << d << std::endl; 
    } 
} 
+0

Как вы получаете C++ 11? Я использую g ++ 4.6.3 – CodeKingPlusPlus

+0

Получите компилятор, который поддерживает. Он компилируется и работает с g ++ 4.6.3 с использованием '-std = C++ 0x'. –

1

Что вы хотите сделать что-то вроде этого:

double RealRand (double up_to) 
{ 
    return double(rand())/RAND_MAX * up_to; 
} 

Эффективно, что это делает сначала сгенерировать случайное число в диапазоне от 0 до 1 (слева включительно), а затем масштабировать число до [0 .. up_to]. (Примечание: на случай, если вы не знаете, функция rand() генерирует случайные целые числа от 0 до RAND_MAX.)

Однако есть (по крайней мере) две причины, по которым вы не хотите этого делать. Во-первых, rand() обычно является плохим генератором случайных чисел. Во-вторых, на некоторых платформах (например, Visual C++) RAND_MAX - очень небольшое число (32767 или что-то еще), что приводит к очень плохим разрешениям для генерируемых реальных значений.

Настоятельно рекомендуется использовать заголовок <random> (новый C++).