2016-11-22 6 views
0

を返さない私はメルセンヌツイスターmt19937ar.cバリアントを使用する方法の例を探してみましたが、ほとんどはC++others seem to use mtwist.hに出てきます。以下メルセンヌツイスター(mt19937ar.c)は乱数

マイコード:

int getRandomNum(void) 
{ 
    int i; 
    i = (int) genrand_int32(); 
    return i; 
} 

int main(int argc, char **argv) 
{ 
    ... 
    int m = getRandomNum(); 
    printf("m = %d", m); 
    ... 
    return 0; 
} 

は、単純に何度も何度も同じ整数を出してくれる。シードの問題のようですが、私がmt19937で乱数を取得したことがわかったすべての実装は単にgenrand_int32()を呼び出すだけです。私はこれを間違ってやっていますか?

答えて

1

メルセンヌツイスターは魔法的ではありません。予測可能な入力からランダムな結果を生成する方法はありません。ランダムなシーケンスが必要な場合は、init_genrand()に一意の値を指定してジェネレータをシードする必要があります。それ以外の場合は、固定デフォルトシード(具体的には5489)を使用します。 - そうでない場合、あなたはシーケンスを再起動します

init_genrand(time(NULL)); 

はしかし、あなたのプログラム中に一度よりも、この多くを呼び出さないでください:

簡単に値を使用するには、現在の時間です!

+0

ありがとうございます!これは助けになりました。 – 8protons

+0

あなたの最初の文は実際には有効ではありません。明示的にシードが与えられていなければ、rngをシードできます。魔法は必要ありません... – Apollys

+0

@Apollys私の答えで説明したように、OPで使用される実装はデフォルトで5489のシードになります。これは非常に古いポータブル実装であるため、 'time()'のような関数は使用できません。 (それらはすべてのプラットフォームには存在しません!) – duskwuff