2012-12-15 6 views
21

が実行されるたびに返されます。ランド()と同じ数のプログラムは、乱数発生関わるこのかなり基本的なC++コードスニペットで

include <iostream> 
using namespace std; 

int main() { 
    cout << (rand() % 100); 
    return 0; 
} 

は、なぜ私はいつも41の出力を取得していますか?私はそれが0と100の間のいくつかの乱数を出力するようにしようとしています。おそらく、私はrand関数の仕組みについて何かを理解していませんか?

+45

は十分では41ランダムではないですか?私は確かにそれを考えていないだろう... –

+4

'srand'(http://en.cppreference.com/w/cpp/numeric/random/rand)を初期化するのを忘れた – Borgleader

+0

違うはずがない私はそれを実行するたびに番号? – codedude

答えて

32

int main() { 

    srand(time(NULL)); 
    cout << (rand() % 101); 
    return 0; 
} 

srand播種事はc言語コードについても同様です。


も参照してください: http://xkcd.com/221/

5

あなたが番号をシードされていません。

使用この:

#include <iostream> 
#include <ctime> 

using namespace std; 

int main() 
{ 
    srand(static_cast<unsigned int>(time(0))); 
    cout << (rand() % 100) << endl; 
    return 0; 
} 

あなたは一度だけしかしそれをシードする必要があります。基本的には、すべての乱数にそれを播種しないでください。

5

srand()シード乱数ジェネレータ。種子がなければ、ジェネレータはあなたが探している数字を生成することができません。乱数の必要性がセキュリティクリティカルでない限り(例えば、あらゆる種類の暗号化)、のようにライブラリのtime()関数を使用してシステム時間をシードとして使用することが一般的です。これにより、Unixのタイムスタンプ(すなわち、1970年1月1日以降の秒数)として表されたシステム時刻で乱数ジェネレータがシードされます。次に、rand()を使用して疑似乱数を生成することができます。ここで

duplicate questionからの引用です:

理由は、ランド()関数から生成された乱数が実際にランダム ではないということです。それは単に変換です。ウィキペディアは、擬似乱数生成器の意味のより良い の説明を提供します:確定的な ランダムビットジェネレータ。 rand()を呼び出すたびに、シードや の最後の乱数が生成されます(C標準ではアルゴリズム が使用されていますが、C++ 11では一般的なアルゴリズムを指定する機能があります)。それらの数値に対する数学演算を実行し、その結果を返します。だから のシード状態が同じである場合(それは本当に の乱数でsrandを呼び出さない場合と同じです)、常に同じ 'ランダムな'数字が出力されます。

あなたがもっと知りたい場合は、以下を読むことができます:あなたはまた、唯一の(包括的)0〜99の番号を生成しているものをその価値については

http://www.dreamincode.net/forums/topic/24225-random-number-generation-102/

http://www.dreamincode.net/forums/topic/29294-making-pseudo-random-number-generators-more-random/

9

。 0から100までの値を生成したい場合は、必要になります。

rand() % 101 

他にも述べたようにsrand()を呼び出すことに加えて、ボーランドのコンパイラなどの

+0

良い点があります。それはupvoteの価値があるでしょう:) – codedude

+0

また、randが101の正確な倍数に一様に分布している数値を返すことはありそうにないので、数値は一様に分布しません。 – jcoder

3

ランダム関数は

using namespace std; 

int sys_random(int min, int max) { 
    return (rand() % (max - min+1) + min); 
} 

void sys_randomize() { 
    srand(time(0)); 
} 
関連する問題