• ベストアンサー

ランダム関数の物理的な仕組み

ハードウェアのところで質問しようと思いましたが、 サーバと書いてあったので、こちらにしました。 プログラミングにはランダム関数というものが、必ず(とは言えないかもしれませんが)あると思います。しかし、この内部構造はどうなっているのでしょうか。 PC内部が電圧で振り分けられて、スイッチがONになったりOFFになったり、もしくは0と1の世界…といった表現で説明されていますが、そういった事は意味は多少わかっているつもりです。 ランダム関数は、数値を適当に返してくるわけですが、この適当なデータをどのように、内部的物理的に発生させているのでしょうか。 ゲームなどでは必需品の仕組みですが…簡単に説明していただけないでしょうか。検索しても物理的なことを説明しているWebページは、案の定見つかりませんでした。 わかる方がいましたら、よろしくお願いします。

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

  • ベストアンサー
  • drmoreau
  • ベストアンサー率41% (33/79)
回答No.1

ランダム関数はハード的に存在しているものではなく、ソフト的なものです。ランダム関数は各々のプログラム言語のライブラリのなかにあります。関数を使って擬似的に乱数を生成しています。自然現象のように本当の意味でランダムなものではありません。

adaypajimy
質問者

お礼

ありがとうございました。 そのようにできているとは知りませんでした。

その他の回答 (5)

回答No.6

ハードの乱数といえば、昔よく使われていたZ80というCPUには、Rレジスタというメモリのリフレッシュカウンタ用のレジスタがあって、この値を乱数に使ったりしていました。 また、シミュレーションや暗号で擬似乱数ではなくて本当の乱数が欲しいときは、乱数発生ICを使うこともあります。これは、半導体内部で生じる熱雑音を利用しています。

adaypajimy
質問者

お礼

ありがとうございました。 私は、何か電気の周波数で乱数をおこしているのかと思いましたが…一応ハードでもあるんですね。こんなに奥が深い世界だったとは…。

  • urakarin
  • ベストアンサー率0% (0/5)
回答No.5

擬似乱数といえば、メルセンヌ・ツイスターではないでしょうか。 http://www.math.sci.hiroshima-u.ac.jp/~m-mat/MT/mt.html

参考URL:
http://www.math.sci.hiroshima-u.ac.jp/~m-mat/MT/mt.html
adaypajimy
質問者

お礼

ありがとうございました。 なにやら精度が高いらしいですね。 研究されているとは驚きです。 結構、おもしろい世界ですね。

  • ymmasayan
  • ベストアンサー率30% (2593/8599)
回答No.4

色々方法はありますが次のような擬似乱数がよく使われます。 混合合同法(mixed congruential method) 下の式に適当な a、p、q を代入する(必要な桁数が採れれば何でも良い)。 求まった a' の中間あたりの必要な桁数を乱数として採用し、それを新たな a として、 再び下の式に代入する。 ap + q = a' (例)5 桁の擬似乱数を作ってみる。ただし、最初は a = 14992、p = 673、q = 944とし、求まった a' の、十の位から十万の位までを採用することとする。 14992×673+944 = 10090560 → 09056 09056×673+944 = 06095632 → 09563 09563×673+944 = 06436843 → 43684 43684×673+944 = 29400276 → 40027 40027×673+944 = 26939115 → 93911 … こうして、擬似乱数列 {14992, 9056, 9563, 43684, 40027, 93911, …} を得る。

参考URL:
http://ja.wikipedia.org/wiki/%E7%96%91%E4%BC%BC%E4%B9%B1%E6%95%B0
adaypajimy
質問者

お礼

ありがとうございました。 なんか、難しいですが…乱数表をつくりはじめるわけですね…。アルゴリズムなども研究されているのですね。

回答No.3

No.1さんが言っている通り、ランダム関数が返してくる数字は、内部にある乱数表を参照しています。 ですから、プログラムの作り方(ランダム関数の呼び出すタイミング)によってはプログラムを実行する度に同じ数字を返してきます。 勿論、これに関しても参照できる乱数表が何パターンか用意されており、参照するパターンを変更する事で返してくる数字を変更出来る様になってます。

adaypajimy
質問者

お礼

ありがとうございました。 そんな単純な仕組みだとは思いませんでした。

回答No.2

コンピュータは0,1で判断するので、 乱数も計算で求められていると思いますよ。 詳しいHPは見つかりませんでしたが、疑似乱数と いう概念です。 だから、物理的には、普通の計算と変わらないか、と。 計算で乱数表を作って、それに従って数値を打ち出し てるんだと思います。 ただ、本当の乱数というのは、けっこう難しく 昔、エクセルで0~9までの10000個の乱数を作り、 平均したりそれぞれの数を数えたりもしましたが、 けっこうばらつきがありました。 3.14・・・・・・の計算からも、いい乱数ができる みたいです。

参考URL:
http://homepage3.nifty.com/mmgames/c_guide/22.html#S1
adaypajimy
質問者

お礼

ありがとうございました。 ゲームプログラミングを考えると、 結構致命的な問題ですね。 私も実験してみるかもしれません。

関連するQ&A

  • 切り替えスイッチの仕組み

    お世話になります。 ギターのエフェクターを作っているのですが、スイッチの仕組みがわからず困っています。 例えばスイッチが4つあったとします。4つは独立した回路です。 ・すべてOFFだった場合、押した個所がONになる。 ・いずれかのチャンネルがアクティブだった場合に、アクティブなチャンネルをOFFにすると全てがOFFになる。 ・いずれかのチャンネルがアクティブだった場合に、他のチャンネルを押した場合には他のチャンネルがアクティブになり、アクティブだったチャンネルはOFFになる。 製品で言うとLINE6 FM4と言うエフェクターと同じ構造にしたいのです。 このようなスイッチの仕組みをなんと言うのでしょうか。また、参考になるページをご存じの場合は教えて頂きたいのです。 何卒宜しくお願い致します。

  • 物理の問題です。

    物理の問題を解いていて、困っている問題があります。わかる方教えてください。 問)測定範囲が0~25mA、内部抵抗3.6Ωの電流計がある。この電流計と適当な抵抗を組み合わせて、次の範囲の測定が出来るようにしたい。それぞれについて接続方法を図示し、抵抗値を示せ。  (1)0~250mAの範囲の電流  (2)0~250Vの範囲の電圧

  • シャントレギュレータの回路の仕組みがよく分かりません。

    シャントレギュレータの回路の仕組みがよく分かりません。 二つ分からない点があります。  一つはカソードとリファレンスの部分に電位差が生じる理由です。 添付の図より、リファレンスとカソードにはQ10のトランジスタが繋がっているだけで電位差がどのようにして維持されているかが分かりません。 Q3,Q4のトランジスタのスイッチがONになると、Q2とQ1のトランジスタがONになってしまうため、Q3がOFFになってしまいやはり電位差が維持されません。 どなたかわかる方教えてください。  もう一点はリファレンス電圧が維持されるということです。リファレンス電圧は定電圧ですが、どういう動作によって定電圧になるのでしょうか、どなたかわかる方教えてください。 よろしくお願いします。

  • アンテナの仕組み

    こんにちは、ふと、なぜアンテナというものは働くのだろう、どういう原理なのかなと思いました。まず、アンテナの内部はどうなっているのでしょうか。たとえばラジオのアンテナ、あれはどういう構造なのでしょうか? 唯の金属の棒でしょうか? その先は何につながれているのでしょうか? 電波を受信しているということですが、いったいどういう現象がアンテナと電波の間に起きているのでしょうか? そしてそれが、アンテナの末端につながっている素子に何を起こしているのでしょうか。疑問だらけですみません。高校の物理くらいがわかっている人を対象にした形でご説明いただけると幸いです。とても疑問でして、お教えください。

  • Androidの関数が呼び出されるタイミング

    現在Androidを勉強中なのですが、関数が呼び出されるタイミングの質問です。 onCreate()はアクティビティ作成時に呼ばれるようですが、 画像のようなプログラムでアクティビティが表示された後、 ボタンを押すとonClick()が呼ばれる仕組みがわかりません。 ボタンを押した後onCreate()自体は呼ばれていないのに、 内部のonClick()がなぜ呼ばれるのでしょうか? このあたりの仕組を説明していただけると助かります。 よろしくお願いいたします。

    • ベストアンサー
    • Java
  • テスターの構造

    いつも勉強させていただいております。 装置のリミットが壊れたようなので、デジタルテスターで導通チェックを しようとしましたら、リミットスイッチ側を測定しているつもりが、 信号ライン側(コネクタの反対)に測定端子をいれてしまい、装置が動いて しまい、ひやりとしてしまいました・・・。 (電源offが基本ですね・・・) そこで、テスターを「導通」にした場合の内部構造はどうなっているのかと 疑問に思いましたので投稿させていただきました。 「導通」にした場合、抵抗値がものすごく小さいので接点がくっついたこ とになり動作したのかと思い、テスターを2個用意し、抵抗を測定したの ですが、測定できませんでした。 ネットで検索したのですが、電圧がかかるような書き方をしている商品説明 は見つけたのですが、なかなか仕組がわからず納得がいかない次第です。 素人質問で大変恐縮ですが、宜しくお願いいたします。

  • 電子回路の仕組みについて

    電子回路の仕組みについて、素人な質問で恐縮ですが以下ご教授下さい。 トランジスターについて独学で学びまして下記のように理解しています。 ---------------------------------------------------------------------------------- NPNトランジスタは、ベース端子に電流を流さない(0.7V以上の電圧がかからない)と「空乏層」という領域ができ、電流を流すことができない。 一方、ベース電流に電流を流すと「空乏層」という領域がほとんどなくなるので、電流を流すことができる。 ---------------------------------------------------------------------------------- つまり、ベース端子に電流を流すか流さないかによって、スイッチのようにON/OFFすることができる、 ということかと思いますが、 そもそもパソコンやらスマートフォンなどはトランジスター含めた部品取り付けられた状態の回路を使用しているわけですよね、 だから電源ONしたら電源からの電気が常に作られた回路を回っている状態になるかと思うのですが、 どうやって(いつ)ベース端子に電流を流す/流さないなどの切り替えを行っているのでしょうか。 トランジスターのところで記載したように参考にした書物には0.7V以上の電圧が必要みたいなことが記載されていたので電圧を調整している部品があるのかなとも思ったのですが、この辺りの仕組みについてご教授頂けますと幸いです。 何卒よろしくお願い致します。

  • RAND関数について

    http://okwave.jp/qa/q6489522.html の質問をしながらさらに疑問に思ったことがあります。 ランダムな数字を発生させようとしてRAND関数を使用しました。 今回は1以上で小数点以下の無い数字を発生させようとしました。 また、今回は9999以下にすることにします。 この場合「=RAND()*10000」とし、 桁区切りで小数点以下を消したら表示はランダムな四桁(以下)の数字が現れました。 ここで(例えば)「1234」の数字が現れたら書式設定する事にし、 条件付き書式から「1234と等しくなれば書式設定」をしたのですが、 1234が現れても書式が変わりません。 見た目は1234でも内部で違う数値だからなのでしょうか? このように乱数を発生させて任意の数字が出てきたら書式設定はどうすればいいのでしょうか?

  • プログラミング 関数の問題について

    どうもお世話になってます。プログラミングの問題ですが問題を見てもよく分らないので答えを教えてください。 double型の数値を引数にして呼び出されたら、それまでに渡された数値の最大値を返す関数 double maxd(double)を完成しなさい。 (1)maxd((2) x) {(3) int i=0; (4)double max; if((5)){ (6); (7); }else if((8))(9); return((10)); } 知り合いに聞いてみたところ (1)double(2)double(3)static(4)static(5)i=0(7)max = x(8)max < x(9)max = x(10)max と言われて説明してもらったのですが、説明してもらってもよく分りませんでした・・・。(そもそもプログラミング分かってないのですが・・・。) 答えだけ聞くのは本末転倒なのですが、上の答えで合っているのでしょうか?もし違っていたら申し訳ないですが正しい答えを教えてください。よろしくお願いします。

  • rnd関数の使い方教えてください。

    初歩的かも知れませんが、よろしお願いします。 仕様環境:Access2007 Win7 ・・・・・ 只今、新規レコードに自動的にランダムな数字が割り振られるように テストしています。 調べたところ「rnd関数」というものを使うということが解りました。 試験用のデータベースを簡単に作り テーブルの項目(フィールド)も簡単にしました。 テストテーブル ------------------- ID(オートナンバー) 名前(テキスト型) 住所(テキスト型) 乱数(テキスト型)または(数値型)←あとで説明しますが。。 ------------------- 乱数のフィールドにある「規定値」にrnd関数を入力しテーブルを保存しようとすると、 「テーブルレベル入力規則の未定義の関数名です。。」と エラーが出てしまいます。テキスト型でも数値型でもです。 rnd関数は、、 int((200-100+1)*rnd+100) ↓入力してエンターを押すと Int((200-100+1)*Rnd()+100)となります。 つまり100から200までの間の数字をランダムに割り振ろうと挑戦しています。 ちなみにテーブルから「乱数」フィールドを消して、フォームにテキストボックスを作り、 コントロールソースに入力しても「未定義です」のようなエラーがでます。(関数の前に”=”もつけたのですが) また規定値に入力しビューで見ると「#Name?」となります。 クエリにrnd関数のフィールドを作ってフォームにつなげても出来ません。 (集計で「演算」にして作ってみたりしたのですが。。) まるっきりrnd関数の使い方がわかりません(汗)。 VBA(モジュール)は使わず、フィールドプロパティなど基本的な機能かマクロでやりたいです。 また重複しないようにしたいのです。 漠然とした相談ですが、どの場面(テーブルやクエリやフォーム)でどう使うか教えてください、 新規レコードにランダムな番号(複数桁で)割り振られるようにしたいです。 宜しくお願いします。

専門家に質問してみよう