プロが教えるわが家の防犯対策術!

ある乱数生成法により,生成した最初の乱数の値は固定するか確かめて頂きたいです.

0.0から1.0までの一様乱数を発生させる方法です.
C言語のコードは以下に載せます.

#define IA 16807
#define IM 2147483647
#define AM (1.0/IM)
#define IQ 127773
#define IR 2836
#define MASK 123459876

float ran0(long *idum)
{
long k;
  float ans;

*idum ^= MASK;
k=(*idum)/IQ;
*idum=IA*(*idum-k*IQ)-IR*k;
if (*idum < 0) *idum += IM;
ans=AM*(*idum);
*idum ^= MASK;
return ans;
}

この乱数生成法をBVAで,計算の中で繰り返し用いようとしています.

idumを任意の整数値に設定・再設定すれば乱数列が初期化されると書いてあったため,idumの値を変えてみましたが,生成された乱数の最初の値は固定されたままでした.

そこで,もともとこの乱数生成法がそのようになっているのかを教えて頂きたいです.

よろしくお願いします.

A 回答 (2件)

Cの関数ran0の中の最初の


*idum ^= MASK;
で、関数の外で設定されたidumの値を使って
MASKとの間でビット毎に排他的論理和を取って
います。当然、外で与えるidumの値が変われば
乱数の最初の値は変わります。
実際、メイン関数を作って、この関数をコンパイル
して、実行してみましたが、そのように動いて
います。
idumの値を変えても、乱数の初期値が変わらない
とすれば、関数ran0の呼び方を間違えていると
思います。
ran0の引数はポインタであることを意識していますか?

なお、Cの標準関数の中にも乱数発生関数randがあります。
これは、関数srandで初期化すれば、初期値を固定
できます。逆にいえば、普通は、randの初期値は
固定されません。
VBAにも乱数発生関数が組み込まれていると思いますが、
これらを使わない理由が何かあるのでしょうか。

乱数の統計的性質が余りよくないのは確かですが、
あなたのran0も同程度でしょう。
もっと性質のよい乱数発生アルゴリズムがあるはず
ですので、ご調査ください。
    • good
    • 0
この回答へのお礼

回答ありがとうございます.

丁寧な説明でわかりやすかったです.見直して行ってみたところ,解決することができました.

本当にありがとうございました.

お礼日時:2010/10/08 15:08

BVAというのが何の事だか分りませんが,C言語で書かれたプログラムで生成される最初の乱数の値は固定なんてことはありませんよ。


どういう使い方をしているのかな?
    • good
    • 0
この回答へのお礼

回答ありがとうございます.

BVAはExcelのVisual Basic for Applicationsのことです.

使い方はそのまま書いていますが,idumを0に設定しないならば,関数中の^演算のある2行は消してもよいと書かれていたため,その2行は消して行いました.また,消さない場合でも生成された最初の乱数は固定されたままでした.

回答によれば固定されることはないということなので,間違っているところがあると思うので見直してみます.

迅速な回答をありがとうございます.

お礼日時:2010/10/07 13:10

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!