• ベストアンサー

乱数って・・・

 乱数は毎回同じ数字がでるようですが・・・どのように決めているのですか? ※Randomize をいれると毎回変わることは知っています

質問者が選んだベストアンサー

  • ベストアンサー
  • k-family
  • ベストアンサー率34% (180/523)
回答No.1

具体的にどの様な方法か、は知りませんが、たとえばこんな方法があります。 a=初期値、たとえば123 x=a*987 a=mod(x,777)   987も777も例です。 これは昔FORTRANの教科書にあった方法です。この初期値をシード(種)と呼びます。RANDOMIZEでこのシードを変更することで同じ乱数列が発生しないようにしています。 RANDOMIZEで新しいシードを作る方法も色々あります。たとえば、そのときの時刻から求めると言うような方法があります。 なお、上記のMODを使う方法を単純に使うと、循環数列になったり、同じ数が続いたりします。そこで、実際にはもう少し手を加えているそうです。 MOD以外の方法としては、何かの演算(ルートなど)をしてできた数字列の中央部から何文字かを取り出す、などの方法もあります。上手く説明できなくてごめんなさい。 直接的な回答になっていませんが、雰囲気は掴んでもらえたかと思います。

その他の回答 (7)

  • wolv
  • ベストアンサー率37% (376/1001)
回答No.8

こちらのページで概略がわかります. こちらのページからのリンクで,いくつかの乱数発生方法の 説明が見られます. http://www.kinyuu.co.jp/report/rep000303.htm

参考URL:
http://www.kinyuu.co.jp/report/rep000303.htm
kennta111
質問者

お礼

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

  • nubou
  • ベストアンサー率22% (116/506)
回答No.7

(2) 0以上の整数mについてx^mをf(x)で割った余りの係数ベクトルをv[m](nビットバイナリデータ)としたとき v[k],v[k+1],v[K+2],v[k+3],・・・・ が0を除くnビット以下のバイナリデータをすべて取る疑似乱数である

  • nubou
  • ベストアンサー率22% (116/506)
回答No.6

疑似乱数が本格的な乱数発生のアルゴリズムです 0と1からなる体をKとし nを自然数とし f(x)が体Kの元を係数とするn次多項式であって 1=x^0,x^1,x^2,・・・,x^(2^n-2)をf(x)で割った余りがすべて異なるとする (このような多項式f(x)を原始多項式といい必ず存在するとことがガロア理論によって証明されている) 乱数発生アルゴリズム: (1) 0以上の整数kを任意に決定する(初期値) (2) x^kをf(x)で割った余りの係数ベクトルをv[k](nビットバイナリデータ)としたとき v[0],v[1],v[2],v[3],・・・・ が0を除くnビット以下のバイナリデータをすべて取る疑似乱数である これは2^n-1の周期で繰り返すが n=16とすると周期は65535であり n=32とすると周期は4294967295である

  • fuji1
  • ベストアンサー率29% (109/371)
回答No.5

こんにちは。。 どうやら質問者の意図が正しく伝わっていないようですね。 たぶん質問者はVBを使用していて、プログラム起動ごとに rnd() とやると、同じ答えが返ってくる、ということをいいたいのではないでしょうか? randomize をプログラム開始時に入れると、いつも違った値になりますよ。 (質問の意味、違ってるかなぁ。。)

kennta111
質問者

お礼

書き方が悪かったようですね・・・・ 知りたかったのは、どのように乱数を決めているかです 回答 ありがとうございます

  • k-family
  • ベストアンサー率34% (180/523)
回答No.4

私の表現がまずくて、誤解されるといけないので補足の追加と、ポイントの再確認をしておきます。 1)一般に計算機で用いる乱数は計算で求めた疑似乱数です。完全な乱数ではあり得ませんが、実用上十分な乱数が出ます。 2)計算で求めていますから、この乱数(乱数列)は再現できます。再現できると言うことは重要なことです。乱数を何かのシミュレーションに用いたい場合、特に重要な科学的計算を行いたいときは、再現できることが重要です。科学の世界では再現実験が重要です。 3)乱数発生の時刻によって乱数列が変わるのではなく、seedを変えない限り勝手に変わら無いようにしています。勝手に変わっては困るのです。 4)以上をふまえた上での話ですが、実際のVBでの乱数発生アルゴリズムを私は知りません。先の書き込みは教科書レベルでの話です。ランダマイズのさせ方も同じように教科書レベルの話です。本当にランダマイズに時刻を用いているかどうかもわかりません。 実際のアルゴリズムについては、#3さんが紹介されたところが参考になるかもしれません。 ※乱数は科学的にも、軍事的にも重要な理論/技術です。暗号関係の本などを勉強されると良いかもしれません。 そういえば乱数表という、数字が羅列されただけの本も出版されています(いました)。少なくとも過去にはありましたが、最近は見かけません。PCで簡単に乱数を発生させることができるので、このような本は不要になってきたのでしょう。乱数表は科学実験や経済の動きの解析、戦争のシミュレーションなど広範囲で使われます(ました)。

  • wolv
  • ベストアンサー率37% (376/1001)
回答No.3

いろいろなアルゴリズムがあるはずです. (専門家ではないので,よく知りません) その一例としてMersenne Twisterというのがあるようです. ここで擬似乱数発生するプログラムのソースコードが 見られるようです.(開発者によるページ) http://www.math.keio.ac.jp/~matumoto/mt.html

参考URL:
http://www.math.keio.ac.jp/~matumoto/mt.html
  • kntr1
  • ベストアンサー率39% (13/33)
回答No.2

VBのコンポーネントである乱数ジェネレータを使用した場合、 タイミングの問題で同じ数字になることがよくあります。 たとえ、ランダマイズを使用したところで、仕様で決まった範囲内の 数値しかありませんし、増加の仕方も決まっています。 その為、完全なランダムの発生は無理であり、より細分化した処理により 範囲の選択肢を増やすしかありません。処理は、VBで考えたことが ありませんので、省かせてください。 Randomizに使用するTimer関数は、午前0時から経過した秒数を 表す単精度浮動小数点数型の値を返します。 その為に、同時刻の同秒にプログラムを起動すると、同じ乱数が発生する わけです。 こんなのでいいですか?

関連するQ&A