• 締切済み

乱数の発生方法

こんにちは! いつも大変参考にさせていただいております。 どうか教えていただきたい事があります。 数学は大の苦手で、学生時代からほとんど勉強してこなかっただけに、 数学の本を読んでも、今回の問題とどのように関係しているのかがわからず、お手上げ状態です。 実行したいのは、確率により乱数を発生させたいです。 たとえば、0から2の乱数を発生させるにあたり、 0の発生は50%、 1の発生は25%、 2の発生は25%、 というように、発生する確率を設定したいと思っています。 確率の本を読んでみたのですが、入門書には確率の求め方は載っていたのですが、それをどのように利用したらいいのかわかりません。 このような乱数の発生のさせかたは可能でしょうか? また、どのようにしたらいいのでしょうか? 教えてください。。。

みんなの回答

  • ese_ee
  • ベストアンサー率48% (68/139)
回答No.3

>0の発生は50%、 >1の発生は25%、 >2の発生は25%、 この例ならば、 0~3までの乱数を発生させ、 3のときは0にする。 で実装できますね。 あらかじめ乱数表を用意し、 そこから任意の回数ひくというやり方としては、 ・任意の重み付けによる 「福引きの1等、2等...」もしくは「おみくじ」方式 や ・重み付けは均等で、乱数がダブらないようにする →「シャッフルしたトランプ」方式 があります。 いろいろ工夫すると楽しいと思います。 ご健闘を。

  • Gab_km
  • ベストアンサー率40% (20/50)
回答No.2

例えば、システム時刻(ミリ秒だけで十分)を取ってきて、4を法とする剰余を求めます。 そして、剰余が0または3の時に「0」を返し、1の時は「1」、2の時は「2」を返す、 というような関数を定義してみましょう。 これもある種の疑似乱数のように振る舞ってくれるのではないでしょうか。

  • sakusaker7
  • ベストアンサー率62% (800/1280)
回答No.1

話の前提として、なんらかの乱数を発生させるライブラリ関数なんかは使っていいんですか? 大抵は一様乱数を発生させるライブラリ関数があるでしょうから、 まず乱数を発生させてからその値に応じて 0/1/2 に振り分けるフィルター関数を 作ってやればよいのではないでしょうか? 擬似乱数もとめるところから自前ででやれということだとちと面倒ですが、 それにしたって調べればいくらでも方法やサンプルが転がってます。 >確率の本を読んでみたのですが、入門書には確率の求め方は載っていたのですが 確率の求め方?

empuru
質問者

お礼

早速のご回答ありがとうございます ライブラリ関数は使用できます RAND()関数で乱数を発生させることができると思っています。 そうか、ssakusaker7さまのおっしゃるように、 乱数を発生させた後に、フィルタ関数をかける方法がありますね!! 擬似乱数というのはどんなものかわかりませんが、 そのフィルタ関数ならなんとかできそうです。 考えてみます!

関連するQ&A

  • 乱数について

    こんばんは。 何度も申し訳ありませんが、今回は乱数について教えてください。 LinuxでCを勉強しているんですが、 randで乱数を発生させることはできたんですが、 そのプログラムを何度実行させても 出てきた乱数は同じ値なんです。 プログラム内で例えば10こ乱数を発生させたとすると 違うものが出ます。 しかし、もう一度そのプログラムをはしらせると 前回と全く同じ並びで同じ数が出るのはどうしてでしょうか? 言ってる意味わかっていただけましたでしょうか? 宜しくお願いします。

  • Excelで乱数発生のアルゴリズム

    今、Excelでの乱数発生に関して勉強しているものです。 プログラミングの本や、乱数の本を読んで線形合同法という漸化式が乱数発生のときに使用されているというところまで調べることはできたのですが、Excelでのアルゴリズムについてはあまり調べられなくて困っています。 知っている方がいらっしゃいましたら教えてください。 よろしくお願いします。

  • 正規乱数の発生法(Inversion法)について

    正規乱数についてですが、様々な発生方法があるかと思います。 私は、Box-Muller法と中心極限定理の二つの方法しか知らないのですが、 いろいろ調べるとInversion法というのがもっとも精度がいい?との意見もあるようでした。 どのようなものなのか本やネットで、結構探したのですが見つけられませんでした。 もしどなたかご存知でしたら、 理論面(数学)の参考文献(本または論文)またはHPと 実際のプログラミング(C++またはVB)が載っている参考文献またはHPを教えていただけないでしょうか?

  • 乱数発生

    #include <stdio.h> #include <stdlib.h> #include <time.h> int main(void) {int y, m, l; srand( (unsigned)time( NULL ) ); y=rand() % 2500 + 1600; m=rand() % 12 + 1; l=rand() % 29 + 1; printf("西暦%d年%d月%d日",y,m,l); return(0); }今回は乱数発生でランダムにだされた西暦年月日をつくりましたが、y=rand() % 2500 + 1600; というのがありこれはyという乱数が2500以下1600以上という意味なのですがなぜかプログラムを実行しても3000いくつとか4000いくつなんてのもでてきます。m=rand() % 12 + 1;はちゃんと12以下1以上でできるのですがなぜですか?本当にわかりません。是非だれか教えてください。

  • 乱数について・・・

    (1)1,2,3,4の整数のどれかを乱数で発生させる方法 (2)0~1までの実数を発生させる方法 を教えていただけないでしょうか?(a.outするたびに値が変わってほしいです。) ※一応、下のプログラムにあるように実行するたびに違う乱数がanswerに入るようにはできたのですが、いまいち理解できていません。軽い説明や参考URLなども教えてもらえたら助かります。 よろしくお願いします。 #include<time.h> int main() { unsigned short time_a,time_b; unsigned long answer; time_a = time(NULL); time_b = time_a; srand(time_b); answer = rand(); printf("答えは = %d\n",answer); }

  • 数学苦手でも解る微分積分の参考書ありますか?

    微分・積分が仕事で必要になり、中学・高校レベルの数学がとても苦手な身で、焦っております。 「微分と積分 超入門」(エスカルゴサイエンス) 「微分・積分が見る見るわかる」(サンマーク出版) この二冊を読みましたが、説明が飛び飛びで、現役学生ではないので詰まってしまっております。 そこで、勉強から離れた身にも、解り易い参考書を探しております。 アマゾンの売れている本のレビューは一通り読みましたが、現役学生さんでも詰まるものが多いようです。 数学が苦手だけど、攻略できた方からのご回答を頂けるととても嬉しいです。 よろしくお願い致します。

  • 数学の勉強法

    現在社会人で、数学とはほとんど無縁の生活を送っています。(無縁なわけではないのですが、面倒なことはコンピュータに任せてしまっているので、原理がさっぱりわからないのです。)実務上の必要性や、視野を広げるために個人的に興味がわきまして、集合論、確率論、解析学などを趣味という程度で勉強してみたいと思います。 ちなみに当方理系の大学は卒業してはいますが、数学はほとんど勉強していなかったので、大学の教養課程くらいの知識から現代数学の入門ができればと思っています。数式は苦手ですが、きちんとわかりやすく書いてあればがんばって読み通します。 何かよい勉強方法や参考書があれば教えてください。入手しやすい本であれば洋書でもかまいません。よろしくお願いします。

  • 数学の成績だけがグンと落ち込んでいます。

     高校生の親です。です。英語や国語等は成績もよく、京大合格ラインのように思います。しかし、数学で、その成績をはき出している。高校入試勉強中から数学が大の苦手。運良く希望校に入学しましたが、今では、数学はお手上げ状態。数学の考え方や基本が分かってないのではと思います。福岡で、何とかしてくれる先生。または、勉強法や参考書等々お教え下さい。今年の4月から2年生になります。よろしくお願いします

  • 三角関数の乱数について

    シミュレーションで用いる為に、 cos^2(θ) (コサイン2乗θです、θは0~90度の範囲) に従う乱数を作成しなければいけません。 (具体的な内容としましては、θを地表と鉛直方向の角度とすると、入射するN(粒子数)が、cos^2(θ)に比例し、それに沿った粒子を大量に発生させる必要がある為) プログラムはC++で書いています。 自分なりに調べて、 確率密度関数をf(x)としたとき、その累積分布関数g(x)の逆関数、 G(x)=g^-1(x)を求め、G(rand())として得られる、という所まではわかったのですが、 昔から数学が苦手な為、 f(θ)=cos^2(θ) g(θ)=(sin2θ)/4 + θ/2 で、これからG(θ)を求める方法がわかりません。 (これは非線型の逆関数でしょうか?) これだけなら数学の方に書くべきかもしれませんが、 このような三角関数の乱数の求めかたはプログラミングの分野で既に周知かなと思いこちらで質問しました。 どうすればいいかご助言を頂きたいです。 求められるのであれば上記の方法の続きでなくともなんでも構いません。 私はプログラム初心者で、まだ知らない便利な関数があり見落としているかもしれないです。 よろしくお願い致します。

  • 高校数学をもう一度。よい参考書を教えてください

    高校時代の数学をもう一度勉強したいと思います。 理由は、高校時代に苦手だった数学だが、ホントに自分は苦手だったのか?マジメにやれば出来たのではないか?という淡い期待の再確認(笑) 30代半ばになり、アタマを使わない毎日では、ボケそう。 以上のような理由です。 勉強したいといっても、趣味の範囲でできればいいくらいです。 その際に使用するオススメの参考書などをお教えください。 尚、学生時代の教科書は既に廃棄済みです。 大人になってから勉強のありがたみを思い知りました。 好きだった教科(歴史・英語)などは既にやっていますが、苦手だった数学だけはまだ手付かずです。 同じように大人になってから再度勉強してみた方や、学生時代に数学が得意だった方など、よろしければお教えくださいませ。

専門家に質問してみよう