• ベストアンサー

[EXCEL]一定の確率で乱数を発生

乱数が0~9まであります。 次の出現率に従って乱数を生成したい場合どのように行えば良いでしょうか? 0の出現率は70%です。 1の出現率は20%です。 2の出現率は10%です。 3~9の出現率は0%です。 よろしくお願いします。

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

  • ベストアンサー
  • nak777r
  • ベストアンサー率36% (49/136)
回答No.4

0~99 の範囲で乱数を出します 乱数の結果が 0~69 なら 0 を返します 70~89 なら 1 を返します 90~99 なら 2 を返します という考え方をすれば良いかと

wansui
質問者

お礼

すごく単純にわかりやすくありがとうございました。 おかげで解決できそうです。

その他の回答 (6)

  • hallo-2007
  • ベストアンサー率41% (888/2115)
回答No.7

必ず、10回で0が7回ということでしょうか?  A   B =Rand() 0 =Rand() 0 =Rand() 0 =Rand() 0 ・・・ =Rand() 0 =Rand() 1 =Rand() 1 =Rand() 2 と対応表を準備します =VLOOKUP(SMALL(A:A,ROW(A1)),A$1:B$10,2,FALSE) と入れて、下へ10行分コピー 再計算(F9)を押すと必ず 0が7個 1が2個、2が1個になるはずです。

wansui
質問者

お礼

ありがとうございました。 解決できそうです。

  • kagakusuki
  • ベストアンサー率51% (2610/5101)
回答No.6

 回答No.2です。  もしかしますと、勘違いされてしまったのかもしれませんが、 >厳密に70%、20%、10%という割合とはなりません という部分の意味は、「出現率が70%、20%、10%にならない」という意味では御座いません。  例えば、サイコロを6回振った時に、偶然にも1が連続して6回現れる事もありえなくはないのと全く同じ理由により、出現率が厳密に70%、20%、10%になっていた場合においても、乱数を実際に100回発生させた際に、0が正確に70回、1が正確に20回、2が正確に10回だけ現れる事は稀で、0が71回、1が18回、2が11回等の様に、現れる割合が、期待される割合と比べてある程度ぶれてしまう事が普通だという意味です。  この事は、他の回答者様方の御回答にある方法においても同様です。

wansui
質問者

お礼

ありがとうございました。 解決できそうです。

  • ts3m-ickw
  • ベストアンサー率43% (1248/2897)
回答No.5

10面体サイコロを作り、0の目を7つ、1の目を2つ、2の目を1つ書けばいいのです。 A1に「=OFFSET(A1,INT(RAND()*10)+1,0)」を入力し、 A2~A11に順に0、0、0、0、0、0、0、1、1、2を並べます。 ファイルを開き直すたび、あるいはどこかのセルを更新するたびにA1セルが所望の出現率で変化します。

wansui
質問者

お礼

ありがとうございました。 解決できそうです。

  • hallo-2007
  • ベストアンサー率41% (888/2115)
回答No.3

一例です。シートに  A B  0  0  1  0  2  0  3  0 ・・・  6  0  7  1  8  1  9  2 と対応表を準備します =VLOOKUP(INT(RAND()*10),A1:B10,2,FALSE) ランダムな整数を、対応表に基づいて表示を変えています。

wansui
質問者

補足

うーん、なかなか思い通りの動きとは残念ながら違っているようです、、、。 やっぱり難しいんでしょうか、、、。 極端な話をすれば、0~9までの乱数を使って10回まわして 1の出る確率が50%、2の出る確率が50%!の結果とか嬉しいんですけど

  • kagakusuki
  • ベストアンサー率51% (2610/5101)
回答No.2

 あくまで確率ですので、サイコロを実際に振った場合において、各目の出る割合が1/6からずれるのと同じように、厳密に70%、20%、10%という割合とはなりませんが、次の様な関数にされると良いと思います。 =MATCH(RAND(),{0,0.7,0.9})-1

  • usami33
  • ベストアンサー率36% (808/2210)
回答No.1

乱数はRAND関数とRANDBETWEEN関数を使用するのはご存知ですよね。 求める範囲を0~9の関数を定義したら、 その戻り値の0~6を0にし 7,8を1 9を2に変換する処理を入れればよろしいかと

wansui
質問者

補足

すいません。ちょっと私の頭が足りてないせいなのか よく理解できなかったです、、><;

関連するQ&A

  • 乱数を一定時間毎に表示させたいのですが・・・

    乱数を生成させることは出来たのですが、 それを0.5秒毎に永遠に表示させることが出来ません (50*Math.random())+200 //乱数生成200~250 setIntervalを検索しても複雑すぎて、ちょっといじるとエラーが出てうまくいきません。 よろしくお願いします。

  • 完全な乱数を生成する方法

    C言語で乱数を生成するときに、今まで srand(time(NULL)); を使用していたのですが、それだと1秒以内に複数の処理を行った際に、 同一の乱数が生成されてしまいます。 時間にとらわれずに完全にランダムな数字を出現させるにはどのような方法を取るのが簡単なのでしょうか? よろしくお願いします。

  • 乱数発生の関数。

    確率分布関数が次の表で与えられているとき,この分布に従う乱数を線形補間を使った逆変換によって生成する関数をどうやって作成したらいいか、全くわかりません。線形補間はなんとなくわかるんですが…。どなたか教えてください。 x F(x) 0 0.0024788 1 0.0173513 2 0.0619688 3 0.1512039 4 0.2850565 5 0.4456796 6 0.6063028 7 0.7439798 8 0.8472375 9 0.9160760 10 0.9573791 11 0.9799080 12 0.9911725 13 0.9963715 14 0.9985996 15 0.9994909 16 0.9998251 17 0.9999431 18 0.9999824 19 0.9999948 20 0.9999985 21 0.9999996 22 0.9999999 23 1.0000000

  • 乱数の発生確率(c++)

    0,1の2値の乱数を発生させるとき、1の発生確率を例えば20%にするにはどのようにすればよいのでしょうか。 発生乱数を除算して余りを求めて・・・・の方法など試したのですが、うまいこといきませんでした。(プログラムが動かないのではなく結果が) 私の確率の認識が間違っているのかもしれませんが、この場合、1000個発生させた場合、300近く1が出れば良いということですよね。

  • 乱数発生ルーチンの使い方について

    数値計算において一様乱数を発生させるルーチンがいろいろあります。ソースが公開されているものやコンパイラが提供したりするものです。それらを利用する場合、乱数発生のシーズ(種)を与えてそれに応じて動作するというものが多いだろうと思います。そこで質問ですが、10000個の乱数を1回発生させる場合と100個の乱数を100回発生させる場合とで乱数の感じがかなり違います。いずれの場合も100×100の2次元データ(エクセルのシート状)として出力して作図したらその違いが簡単に分かります。この違いの原因はシーズの与え方が1回と100回という違いだろうと思います。100回のシーズの与え方にパターンが出来てしまうからだと思われます。例えば時間を使ってシーズを与えなおすことも考えられますが、今時のPCだとあっという間なのでシーズが同じだから、同じ乱数が100個できてしまいます。乱数を繰り返し発生させるときにその繰り返しの中でパターン化された乱数にならないように発生させる方法がないでしょうか。シーズが要らない乱数生成ルーチンとかですが。あるいはシーズをランダムに取得する方法が含まれたルーチン(シーズがないように見える)などです。あるいは本当にないものなど。メルセンヌツイスターはどうなのでしょうか。一応、フォートランでの利用を考えていますが、言語依存の問題ではないかもと思いますが。 よろしくお願いします。

  • 乱数です(・ω・;)

    乱数は作れます(time を使ってやるということです) 今までも、1~6の乱数を生成することなどが出来たのですが、0.0035や0.123などの小数を含む0から1の間の数をどのように生成したらよいでしょうか? よろしくお願いしますm(・ω・)m

  • Excel2007 一様乱数 指数乱数を用いてポアソン乱数を発生させる

    指数乱数を用いてポアソン乱数を発生させるにはどうすれば良いのでしょうか。

  • 乱数と確率

    今、100人の人がいて、そのうちの1人が風邪をひいています。 感染率をAとして、10日間経過する間にどのくらいの人が風邪をひくのか乱数を用いてシミュレーションしたいのですが、どのようにすればいいのかわかりません。このとき各個人が風邪を引く確率をA×(前日に風邪をひいている人数)とします。 感染率は最初に打ち込むんですが、例えば0.1とうちます。 そうすると初日に風邪を引いているのは1人なので次の日に各個人が風邪を引く確率も0.1になります。 このとき、99人のうち何人が風邪を引くのかという人数の算出方法がわかりません。どうやらDeseaseという関数を使うらしいのですが^^; それと、このときまずはじめに要素を100個持つ配列を宣言し、1つの要素以外はすべて0で初期化するっぽいのですがこのやり方もわかりません^^; よければ教えてください!!

  • 乱数発生関数randomなど

    random, srandom, initstate, setstate で乱数を生成できることを知りましたが、運用方法がよくわかりません。c言語に詳しい方、for文を使って乱数を5個ほど表示させるプログラムを示してください。

  • 乱数生成について

    VisualBasic2010を使用しています。 コード内に複数回、乱数を生成しています。 普段は始めだけRandomizeして、Rnd関数を使用していて、毎回違う乱数を生成させているのですが、 今回は毎回同じ乱数を生成させたいのですが、どうやったらできるでしょうか? シード値をどうこうするとは、わかったのですがやり方がわかりません。 わかる方、どうぞよろしくお願いします。