2011-10-13 13 views
20

ゲームを実行するたびに出力されるランダムな数字が同じシーケンスで出力されます。なぜこうなった?プログラムを実行するたびに同じ乱数が返される

私は

#include <cstdlib> 

を持っており、あなたの乱数ジェネレータをシードする必要がある乱数

randomDiceRollComputer = 1 + rand() % 6; 
+0

http://en.wikipedia.org/wiki/Pseudorandom_number_generator – DuckMaestro

答えて

26

を生成するためにこれを使用しています:

はの初めにこれを入れてみてくださいプログラム:

srand (time(NULL)); 

#include <ctime>が必要であることに注意してください。

ここで考えているのは、プログラムを起動するたびにRNGに別の番号を付けることです。時間をシードとして使用すると、プログラムを起動するたびに異なる番号が得られます。

+0

ええ、それは播種という意味ではどういう意味ですか? – mystycs

+4

基本的に、RNGは実際にランダムではありません。それらは一見すると(擬似)乱数を生成する式を使用します。そのため、シーケンスの生成を開始するには「開始点」が必要です。あなたがシードしなければ、それは同じデフォルトシードを使用し、毎回同じシーケンスを生成します。 – Mysticial

+2

良い結果を得るには、 'srand'の後に' rand'を一度呼び出し、戻り値を捨ててください。同様の種子が同様の第一の価値を生み出すが、それは急速に発散することが分かる。 –

7

randum番号ジェネレータに種を渡す必要があります。これは現在の時間をとることで行うことができます。これはうまくいくらかのランダムなものです。

#include <cstdlib> 
#include <ctime> 
using namespace std; 

int main() 
{ 
    int r; 
    srand(time(0)); 
    r = rand(); 
    return 0; 
} 
0

擬似乱数ジェネレータは、開始番号またはシードを取り、それからこのシーケンスから次の番号を生成します。そのため、擬似乱数と呼ばれています。なぜなら、常に同じ開始値を使用すると、C標準のlibジェネレータのような同じシーケンス番号が生成されるからです。これは、プログラムが現在の時刻と同じように実行されるときに変更される開始値をジェネレータに与えることで修正できます。

とにかく、あなたが言っているような他の人を探しているコードは次のとおりです。指定されたシードを播種したときrand()機能は、具体的数字の同じシーケンスを生成するために必要とされる

srand(time(0)); //Seed the generator, give it a starting value 
+0

いいえ、擬似乱数と呼ばれるのは、数学的な意味では本当にランダムではなく、近似でしかないからです。それが実行されるたびに異なる番号を生成するPRNGは、依然として疑似乱数です。 –

+0

@KeithThompson私が知っているのは、この特定のタイプのPRNGがPRNGであるということです。より一般的には、PRNGは決定論的アルゴリズムを使用してシーケンスの各値を見つけ出すため、疑似乱数として知られています。 – jgon

1

srand()を呼び出すことによって) ;可能な各シード値はシーケンスを指定します。 srand()を決して呼び出さない場合は、rand()を呼び出す前にsrand(1)を呼び出すと、同じシーケンスが得られます。

(これは異なるCまたはC++実装では適用されない。)

これはテスト目的のために有用であり得ます。たとえば、プログラムにバグがある場合、同じシードで再実行して再現することができます(他の予測不可能な動作がない場合)、同じ擬似乱数のシーケンスが得られることが保証されます。

srand(time(NULL))を呼び出すことは、予期しない擬似乱数を多かれ少なかれ取得するために通常推奨される方法です。しかし完璧ではありません。プログラムが同じ秒で2回実行される場合、time()(通常)の分解能は1秒なので、おそらく同じシーケンスが得られます。そして、典型的な `rand()実装はではなく、で十分です。攻撃者があなたが得る数字を推測するのは容易ではありません。

他の多くの乱数の実装があります。 Linuxシステムには2つの擬似デバイス、/dev/random/dev/urandomがあり、そこからかなり高品質の擬似ランダムバイト値を読み取ることができます。システムによっては、random(),drand48()などの機能を持つものがあります。そして、多くのアルゴリズムがあります。私はMersenne Twisterについて良いことを聞いた。

ゲームのように、不正行為しようとしているプレイヤーを期待しない、気にしないプレイの場合は、srand(time(NULL))rand()で十分でしょう。より深刻な目的のために、あなたは私よりも多くのことを知っている人から助言を得るべきです。

comp.lang.c FAQのセクション13には、疑似乱数生成に関するいくつかの非常に良い情報があります。

関連する問題