2016-09-08 4 views
1

C++を使用して乱数を生成しようとしていますが、ランダムではないようです。私はもちろんそれらが擬似ランダムであることを認識していますが、私が見つけたのは実際にはそれを擬似ランダムとして切断していません。ここに私のコードは、私がこのCPPファイルをコンパイルし、実行しているから得られる結果は、常にいくつかの一見ランダムな数字が続く0.63を開始C++の乱数はランダムではありません

#include <iostream> 
#include <time.h> 

int main(){ 
    srand (time(NULL)); 
    std::cout << (double) rand()/(double) RAND_MAX; 
    return 0; 
} 

です。

紛失しているものがありますか? srandを使って乱数ジェネレータを正しく初期化していませんか?なぜ0と1の間の数字がランダムでないのですか?

おかげ

+2

再現できませんでした:https://s13.postimg.org/oy2bv4izb/image.png –

+1

不足していると思われる乱数のサンプルを追加できますか?また、どのプラットフォームを実行していますか? –

+0

'rand()'は、0と1ではなく、0と 'RAND_MAX 'の間の数値を返します。' RAND_MAX'は "少なくとも32767"であると定義されています。たとえば、 'RAND_MAX'が2147483647であると仮定すると、' rand() 'は0.630と0.639の間の結果を出す計算のために、おおよそ1352914697と1372242050の間の値を返さなければなりません。それはかなり広い範囲の乱数です。一方、C++独自の[乱数ジェネレータ](http://en.cppreference.com/w/cpp/numeric)を使用する必要がある場合は、古い** C ** 'rand()'関数を使用しています。 /ランダム)。 –

答えて

4

初期乱数値がシード値に大きく依存している場所、あなたのコンパイラのrandの実装は、非常に貧弱であるように見えます。返された値を使用する前に、いくつかのランダムな値を生成して破棄することができます。

さらに、randを呼び出しないでください。 <random>ヘッダーで提供されている機能を使用してください。

+0

私は経験から、Microsoftの 'rand'がこのプロパティを持っていることを知っています。 –

2

あなたはthisを試すことができます。

struct timeval; 
gettimeofday(&time, NULL); 
srand(hash3(time.tv_sec, time.tv_usec, getpid())); 

hash3:

unsigned int hash3(unsigned int h1, unsigned int h2, unsigned int h3) 
{ 
    return ((h1 * 2654435789U) + h2) * 2654435789U) + h3; 
} 
0

根本的な問題はrand()が "悪い乱数生成器" としてのCのマニュアルで説明されていることです。代わりに<random>ライブラリを使用する必要があります。あなたが意図的にのみsrand()で発電機を播種した後、生成された最初の値を比較しているが、一般的に、擬似乱数を一度それらを播種して、一連の数字を生成することにより、使用されている場合はさらに、それは不明だ

What difference between rand() and random() functions?

を参照してください。 。

関連する問題