2012-04-12 11 views
0

可能性の重複:
why do i always get the same sequence of random numbers with rand()?なぜ私は同じ乱数を得続けているのですか?

私も(同じマシン上で)異なるプログラムを使用してコンパイル/実行するために、という事実によって混乱、およびvauesをnilling後(前午前後に)関数..それは何もない..私はそれを実行するたびに同じ "ランダムな"数字を取得し続けます。私はTextMateで...これは..私は単に可能であるとして説明するつもりです動作するようになっていますかではありません

​​

実行それを誓う:CodeRunnerで

i686-apple-darwin11-llvm-gcc-4.2 
8 9 
0 (null) 

実行して:

i686-apple-darwin11-llvm-gcc-4.2 
8 9 
0 (null) 

必要に応じて100万回実行します。あなたはいつもどんなものか推測することができます。なぜこれが起こるのですか?なぜああ、なぜこれは "どのように"ですか?

+0

私の質問は、これらの結果がOS /メモリの論理的な分割にまたがっていること、そして 'rand'自体よりも値にnullを割り当てているにもかかわらず起こるという事実を実際に多く持っていました。 –

+2

@alexgrayこれは、異なるOSが同じPRNGを使用していることを意味します。これは予期しないことではありません。ヌルを設定しても何も変更されません。メモリバグではなく 'rand'の予想される動作です。 –

+0

自動生成された重複リンクは削除しないでください。司会者の注意を喚起するためにこの質問にフラグを立てるか、それを再度開くべきだと思う場合は[Meta.SE]に問題を提起することができます。 –

答えて

6

理由(rand manページから)これは次のとおりです。

If no seed value is provided, the rand() function is automatically 
    seeded with a value of 1. 

それは常に、それは常に同じ数列を生成します同じ番号を播種しているので。実行するたびに異なるシーケンスを生成するには、実行するたびに別のシードを使用する必要があります。 srand()を使用してシードを設定できます。

+2

共通パターンは 'srand(time(NULL))'であるため、プログラムの連続した実行では異なるシードが得られることに注意してください。 –

3

数字はランダムではないので、pseudorandomです。それらは、同じ初期シードが与えられた場合、常に同じ出力を生成するアルゴリズムに従って生成されます。あなたはPRNGを播種していないので、デフォルトの一定のシードを使用します。

PRNGを予想しにくいもの(現在の時刻やPIDなど)を使用してシードすると、毎回異なる結果が得られます。 rand(3)の場合は、srand(3)とする必要があります。 randはそれが(実際に行うには非常に困難なことである)真の乱数を生成しないという意味、擬似乱数生成器であるため、

2

それはそのようである理由があります。それは“シード”を使用してシーケンス内の次の番号を生成します。実行の開始時には常にシードが同じ値(1またはそれ以上)に設定されます。シードを変更しないと、常に取得されます乱数の同じシーケンス。 srand(time(NULL));のようなものを使用して、時間に基づいて乱数ジェネレータをシードしたり、暗号化目的のために十分に強い乱数ジェネレータ(arc4random)を使用することができます。

あなたがするかもしれないこと“なぜこれのようなのですか? ”ですが、同じ一連の“乱数”を複数回生成したい場合もあります。

+0

ああ、以前はarc4randomを使っていましたが、これはあまりにも奇妙に思えました。実際にメインに持ち込まれる前に '#define rand()(arc4random()%((unsigned)RAND_MAX + 1))'もう一度。ありがとう。 –

+1

確定的なマシン(別名コンピュータ)では、真の乱数を「生成する」ことは不可能ではなく、困難でもありません。無作為の外部源が必要です。 –

+0

@alexgrayこれを行っても、あなたは疑似乱数を使用していますが、arc4randomは定数値 '1'よりもユニークなものをシードします。 – tobyodavies

関連する問題