2017-11-08 9 views
0

GSLには多くのランダムジェネレータがあります。たとえば、最大等配分の組み合わせTauswortheジェネレータの実装は、gsl/taus.cに配置されます。ランダムシードは以下の関数で設定されます:ランダム発電機のウォームアップの役割は何ですか?

static inline unsigned long 
taus_get (void *vstate) 
{ 
    taus_state_t *state = (taus_state_t *) vstate; 

#define MASK 0xffffffffUL 
#define TAUSWORTHE(s,a,b,c,d) (((s &c) <<d) &MASK)^((((s <<a) &MASK)^s) >>b) 

    state->s1 = TAUSWORTHE (state->s1, 13, 19, 4294967294UL, 12); 
    state->s2 = TAUSWORTHE (state->s2, 2, 25, 4294967288UL, 4); 
    state->s3 = TAUSWORTHE (state->s3, 3, 11, 4294967280UL, 17); 

    return (state->s1^state->s2^state->s3); 
} 

static void 
taus_set (void *vstate, unsigned long int s) 
{ 
    taus_state_t *state = (taus_state_t *) vstate; 

    if (s == 0) 
    s = 1;  /* default seed is 1 */ 

#define LCG(n) ((69069 * n) & 0xffffffffUL) 
    state->s1 = LCG (s); 
    state->s2 = LCG (state->s1); 
    state->s3 = LCG (state->s2); 

    /* "warm it up" */ 
    taus_get (state); 
    taus_get (state); 
    taus_get (state); 
    taus_get (state); 
    taus_get (state); 
    taus_get (state); 
    return; 
} 

私の質問はなぜ6つの「ウォームアップ」が必要ですか?ウォーミングアップがないと何か問題はありますか?

答えて

1

6はおそらく任意の数です。ランダム性が不十分で、起動が遅くなるほど大きくないような小さなものではありません。

あなたが投稿したコードで参照されている論文にその記載はありません。別の論文(http://www0.cs.ucl.ac.uk/staff/d.jones/GoodPracticeRNG.pdf)では、乱数生成器の「ウォームアップ」の必要性が議論されています。

本質的に、「あなたのシード値のエントロピーが非常に低い」ときに使用されます。議論は、参考文献の9ページにあります。

+0

このペーパーは大変感謝しています。 –

関連する問題