2013-04-11 15 views
5

rand()またはqrand()関数はランダムなintを生成します。2つの範囲の乱数

int a= rand(); 

私はこの作業を行うことができますどのように0と1 の間の乱数を取得したいですか?

答えて

8

あなたはfloatへのランダムintを生成し、このように、RAND_MAXことによってそれを分割することができます

float a = rand(); // you can use qrand here 
a /= RAND_MAX; 

結果は、0から1までの範囲に包括的であることになります。

+2

'RAND_MAX'は、ジェネレータが返す最大値であるため、範囲は1になります。 –

+0

@PeteBeckerそうです、両端に包括的です。ありがとう! – dasblinkenlight

2
#include <iostream> 
#include <ctime> 
using namespace std; 

// 
// Generate a random number between 0 and 1 
// return a uniform number in [0,1]. 
inline double unifRand() 
{ 
    return rand()/double(RAND_MAX); 
} 

// Reset the random number generator with the system clock. 
inline void seed() 
{ 
    srand(time(0)); 
} 


int main() 
{ 
    seed(); 
    for (int i = 0; i < 20; ++i) 
    { 
     cout << unifRand() << endl; 
    } 
    return 0; 
} 
2

チェックthisポスト、それは)私の知る限りでのrand(周りにスレッドセーフラッパーであるあなたの目的のためにqrand使用する方法を示しています。あなたは次の操作を行うことができますC++ 11を使用して

#include <QGlobal.h> 
#include <QTime> 

int QMyClass::randInt(int low, int high) 
{ 
    // Random number between low and high 
    return qrand() % ((high + 1) - low) + low; 
} 
6

はランダムヘッダーを含める:

#include<random> 

はPRNGと配布を定義します。

std::default_random_engine generator; 
std::uniform_real_distribution<double> distribution(0.0,1.0); 

をゲット乱数

double number = distribution(generator); 

this pageおよびには、uniform_real_distributionに関する参考情報があります。

1

精度を定義する乱数からモジュールを取り出します。その後、モジュールで浮動小数点型に分割します。

float randNum(){ 
    int random = rand() % 1000; 
    float result = ((float) random)/1000; 
    return result; 
} 
+0

シンプルで実用的なソリューション。ちょうど1つの問題:モジュール(この場合は1000)が 'RAND_MAX'で均等に割り切れない場合、これによって生成された乱数は、範囲内の大きな乱数に比べて小さな数値を生成するように少し偏っています。 – Jakob

関連する問題