[[20200206211810]] 『乱数の発生率を指定したい』(ちち) ページの最後に飛ぶ

[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]

 

『乱数の発生率を指定したい』(ちち)

初めまして

乱数を、9〜13の間で85個発生させたいのですが
その際、7〜8割を11とし3〜2割を残りの数値と
したいのですがやり方が分かりません。

関数の組み方を、教えてください。

< 使用 Excel:Excel2016、使用 OS:Windows10 >


=IF(INT(RAND()*1000)+1>311,11,INT(RAND()*5)+9)
(通行人) 2020/02/06(木) 22:51

https://www.relief.jp/docs/003097.html
http://zellij.hatenablog.com/entry/20111029/p1

やりたいことは↑こういう事ではないですか?
(まっつわん) 2020/02/06(木) 23:10


 9〜13までの出現確率をどう思うかによって回答は変わってくるでしょう。
 (a)11だけが特別で、その他は均等と考えると、通行人さんの考えになるでしょうし、
 (b)中心に厚いということは、9,13の頻度が低く、10、12がそれに続いて高い、11が最も高いと
    考えると、別の考えになるでしょう。
 たぶん、前者(a)でいいんでしょうかね。特にコメントがないところからすると。

 仮に後者(b)もあるとして、一般的な方法を書くと、
 設定したい9〜13それぞれの発生確率をp1からp5とすると、
 一様乱数Randをとって、
                Rand   < p1        なら   9
 p1          <= Rand < p1+ p2      なら  10
 p1+p2       <= Rand < p1+p2+p3    なら  11
 p1+p2+p3    <= Rand < p1+p2+p3+p4 なら  12
 p1+p2+p3+p4 <= Rand               なら  13
 とすればよいことになります。(いわゆる逆関数法)

 前者(a)の場合は、通行人さんと同様の考え方で、
 =IF(RAND() < 0.6875,11,RANDBETWEEN(9,13))
 などとして場合分けを回避して、計算負荷を軽減することも可能でしょう。

 (ちなみに、11の発生確率は75%,その他は均等としています。
  0.6875 = 75% - 25%/4 を使うことで、
  0.6875 + (1-0.6875)/5 = 75% となります。)

(γ) 2020/02/07(金) 08:27


なお、85個程度だと、期待値通りにはならず、
11が80%以上だったり、70%以下で発生することも当然あります。
それが乱数というものです。
(γ) 2020/02/07(金) 08:31

 >やり方が分かりません。
 私なら ということで考え方だけ書いときます。
 (1) まず11の個数を求める:85×70〜80%の間 ex 61個の11
 (2) 残りの個数分 9〜12の間で24個の数値を求める
 (3) (2)の中の11を13に置換する
 (4) 必要なら上記の出現順をシャッフルする。

(チオチモリン) 2020/02/07(金) 10:44


追記です。
やり方は、
=IF(RAND() < 0.6875,11,RANDBETWEEN(9,13))
を個数分(85個)コピーペイストすることです。

仮に10000個作成すると、
11の発生回数は試行回数の75%に相当近づくはずです。
これは、サイコロを6回振っても1から6までが
1回ずつ起きるわけではなく、
多数回実行すると、どの目も1/6の発生割合に近づくのと
同じです。
シャッフルするのと、分布に従う乱数発生は別物です。

(γ) 2020/02/07(金) 13:05


私だったらこう考えるという例なぞ。

まず、7〜8割というのは、間を取って75%とします。11が出る確率が75%、ですね。
他の数字は残りの25%を4等分して、それぞれ6.25%。
少数部分が消えるまで倍化すると、1/0.0625=16。つまり、16倍すれば1になります。
表にすると、以下ですね。

	値	数	確率
	9	1	 1/16 =6.25%
	10	1	 1/16 =6.25%
	11	12	12/16 =75%
	12	1	 1/16 =6.25%
	13	1	 1/16 =6.25%

数の分だけ数字を並べた配列を作り、この中から1つを選ぶと、11は75%の確率で発生するランダムになるでしょう。

 =INDEX({9,10,11,11,11,11,11,11,11,11,11,11,11,11,12,13},RANDBETWEEN(1,16))

この方法だと、11が発生する確率はランダムにバラつくので、7〜8割の範囲外になる事もあります。
絶対に範囲外にしたくないならば、上の16個の数字を配列に入れて、ランダムにシャッフルするようなマクロを作れば良いと思います。
まぁ、生成する個数が80個ならば16x5で作成してシャッフルすれば常に75%にできるのですが、85個だと割り切れないので、少しバラつくでしょうけど。
(???) 2020/02/07(金) 13:47


コメント返信:

[ 一覧(最新更新順) ]


YukiWiki 1.6.7 Copyright (C) 2000,2001 by Hiroshi Yuki. Modified by kazu.