2011-11-13 14 views
3

私はrgbaの浮動小数点乱数ジェネレータに出くわした:説明が明確であり、コードはシンプルですこのコードで乱数を生成する場所はどこですか?

http://rgba.org/articles/sfrand/sfrand.htm

。 1つの問題があります。ランダムなビットがどこから来るのか分かりません。以下のコードは、スニペット:

static unsigned int mirand = 1; 

float sfrand(void) 
{ 
    unsigned int a; 
    mirand *= 16807; 
    a = (mirand&0x007fffff) | 0x40000000; 
    return(*((float*)&a) - 3.0f); 
} 

を私はcompile this functionしようと常にmirand1として始まる場合は理にかなって-0.995993の結果を、手に入れました。何が欠けているのですか、またはmirandは単に種ですか?

+1

必ずしも同じ番号を返すとは限りません。行を何度も呼び出すと、毎回異なる番号が返されることがわかります。もちろん、プログラムを実行するたびにシーケンスが同一になります。 – Gabe

+0

@Gabe:最初はcodepad.org、ideone.com、自分のマシンでコンパイルしました。私はideone.comを除いて '-0.995993'を得ました。私は' -3'を与えました(そして間違っています)。私はこの機能を何度も実行しました。@ aleph_nullの答えは、私が使用の意図を理解する助けになりました。 –

+0

ループ内で関数を実行すると毎回同じ結果が得られると言っていますか? – Gabe

答えて

6

真実は、そのコードは乱数を生成しません...それは疑似ランダム番号を生成します。あなたが同じ種から始めると仮定すると、何が起きているのか想像する素人の方法は、あなたが巨大な数の乱数のリストをたどっているということです。結局のところ、数字は繰り返されますが、良い公式はこの繰り返しを大きな間隔で行うものです。明確にするために

は、Excelが使用するランドの式を見てみましょう:http://support.microsoft.com/kb/828795

+0

それは理にかなっています!ありがとう。私はちょうどここであなたの答えを確認しました:http://codepad.org/d96GzyBVあなたの答えは、タイマーがなくなったときに受け入れます。 :] –

1

あなたは、これは普通のもののような擬似乱数生成器が実際にあるので、すべての時間が同じ番号を取得している理由。それには種がないので、n番目の呼び出しで常に同じ値を取得します。あなたは、いくつかの後続の呼び出しを行う場合は、-1と1の間で均一である結果を、表示されますsfrandします

-0.995993 
0.347347 
-0.130602 
0.970146 
-0.749159 
0.883045 

同じように、あなたがしたいことを播種することなく、通常のrand()関数を呼び出すした場合同じシーケンスを参照してください。

static unsigned int mirand = 1; 

float sfrand(double seed) 
{ 
    unsigned int a; 
    mirand *= seed; 
    a = (mirand&0x007fffff) | 0x40000000; 
    return(*((float*)&a) - 3.0f); 
} 

int main() 
{ 
    srand(time(NULL)); 
    int count = rand() % 1000 + 1 
    for(int i = 0; i < count; ++i) 
     sfrand(); 
} 

まだあなたにランダムシードを与えながら、これは単なる最初のカウント値を破棄し、:説明したようにあなたは何回乱数関数を呼び出すことによって、この番号をシードすることができますので、番号16807は、正当な理由のために選択しましたそれ以降のすべての呼び出しでは、その関数が意図するパフォーマンスの向上が得られます。その後の呼び出しで一意の値が返されるようになりました。

codys-macbook-pro:~ cody$ ./a.out 
0.166836 
codys-macbook-pro:~ cody$ ./a.out 
0.256372 
codys-macbook-pro:~ cody$ ./a.out 
-0.194259 
codys-macbook-pro:~ cody$ ./a.out 
-0.556834 
+0

実際には、記事を再読み込みすることができます。彼らは正当な理由で16807を手に取った。それでも、あなたの説明は私たちの理解に同意します。 :] –

+1

彼らがしたことは、私は答えを編集して、動作するランダムなシードを含めることにします。 – Cody

+0

うーん、興味深い。異なるシーケンスを生成するために別のシードを使用することを好みますが、最初のn個の値を破棄することは確かに論理的ですが、最初はオーバーヘッドに苦しんでいます。 –

関連する問題