- ベストアンサー
ランダムな数値を条件付きで作成する方法
- 条件付きで、指定した数値の個数と分布幅を持つランダムな数値を作成する方法について説明します。
- 例えば、商品の値段を仮定して説明します。指定した個数の商品の値段を、指定した範囲内でランダムに決め、平均値が指定した値になるようにします。
- エクセルを使えば可能ですが、乱数を生成するソフトウェアもあります。
- みんなの回答 (7)
- 専門家の回答
質問者が選んだベストアンサー
乱数を使って、平均値を100円にするのは困難でしょう。 乱数は多数回、発生させると一様な出現回数になると思います。 ですから、平均=(88+107)/2=97.5となり100にはならないでしょう。 そこで、代案ですが45個の乱数を発生させて平均値を求め、その差額を加算するというのはいかがでしょう。 A2~A46 =RANDBETWEEN(88,107) B2 =100-AVERAGE(A2:A46) A2 =ROUND(A2+$B$1,0) 下へCopy 平均に端数は出ますが、その辺は応用で・・・
その他の回答 (6)
- kitty2008
- ベストアンサー率31% (58/185)
乱数にはいろいろ種類があります。RAND()は矩形乱数というものです。一般によく観察されるのは正規分布乱数、あるいは二項分布乱数です。ポアソン乱数というのもあります。 まず、それを指定しないと回答できないと思います。
- imogasi
- ベストアンサー率27% (4737/17069)
>平均値 乱数を作り、その平均をXとする。個々のデータ全てに、Xと100の差をたす(場合によっては引く)と平均を100にした数を作れると思う。 しかしデータ範囲に影響するので難しい。 理論的に平均を縛ることが、乱数性を乱さないのか、数学の理論的知識が無くてわからない。 >数値の分布幅(例えば88~107) これだけなら、エクセルにはRANDBETWEEN 関数が在る。WEBで照会のこと。 >数値の個数(例えば45) 45セルに関数を入れれば済むのでは。 式はセルごとに複写する。 再計算の都度(セルに式の複写の機会にも)更新されるから、45セルの乱数が作れたら、セルの値をそのセルに複写して、式を消すことが必要と思う。 ーー これは本当はエクセルの質問ではなかろう。数学のカテに質問して、妥当性をチェックしてもらったほうがよい。そういう人は(エクセルは今や国民的必須教養で)、必ず知っているから、そちらの回答の方が信を置けると思う。 ーー >乱数を作るソフトなどあれば 乱数というのは数学的に奥が深いように思う。だから諸理論や方法で 色々方式があるように思う。 Googleで「乱数を作るソフト」で照会すると記事が出る。 ーー それにしても、大げさな質問だが、何に(どういうことに)使うのかな。 参考に「擬似乱数」の解説を、読んでおいたら。 http://ja.wikipedia.org/wiki/%E6%93%AC%E4%BC%BC%E4%B9%B1%E6%95%B0
- mt2008
- ベストアンサー率52% (885/1701)
マクロでそれらしい数値になるように作って見ました。 やっている事は、平均値をA列に個数分並べて、行を2つ選んで最大値/最小値を超えないように適当な値をプラス/マイナス を、繰り返しています。 乱数とは言えませんが、「それらしい」数値にはなるかと思います。 Sub Sample() nAve = 100 '平均値 nCount = 45 '個数 nMin = 88 '最小値 nMax = 107 '最大値 '平均値を個数分A列に並べる For i = 1 To nCount Cells(i, 1) = nAve Next i Randomize '乱数初期化 '並び替えを全体に何回か行う(有る程度やると乱数らしくなる) For j = 1 To (Int(Rnd() * 5) + 1) 'A列1行づつ処理 For k = 1 To nCount 'kが処理行 '対にする行を乱数で選択 nTarget = Int((nCount - 1) * Rnd) + 1 '乱数で選択された行が処理行で無い場合処理続行 If k <> nTarget Then nkDif = nMax - Cells(k, 1) '最大値と処理行の値の差 ntDif = Cells(nTarget, 1) - nMin '最小値と選択行の値の差 '0~「上の2つの差の内、小さい方」の範囲で乱数作成 nwork = Int(Rnd * (1 + Application.Min(nkDif, ntDif))) Cells(k, 1) = Cells(k, 1) + nwork '処理行の値に作った乱数をプラス Cells(nTarget, 1) = Cells(nTarget, 1) - nwork '選択行の値に作った乱数をマイナス End If Next k Next j End Sub
- fujillin
- ベストアンサー率61% (1594/2576)
>条件付きで、ランダムな数値~~ ある条件が付けば、それはランダムではなくなるはずでは? >平均値(例えば100) >数値の分布幅(例えば88~107) となるような母集団はいくらでもあり得るので、どのようなものを想定するかで得られる値はまったく変わってきます。 母集団分布の例を添付の図に示します。 それぞれの場合で86~107までの積分値が1となり、かつ86~100の積分値が0.5となるようにして、xについて解けば乱数(=累積値)から分布(x)を求める関数を作ることができます。 一番簡単な「例2」の場合で考えると、 X = x-86とすれば、 X^2 + 7*X - 7*84*y = 0 ( 0<y<1 ) なので、これをxについて解いて、yを0~1の値をで発生させれよいという具合です。上例だと x = (sqrt(2352*y+49)-7)/2 + 86 ( =X + 86 ) となります。 ただし、この関数から得られた有限個のサンプルは、ご指定の条件に近いものではありますが、サンプル集団なのでピッタリの値にはなりません。 (平均値の期待値は100だが、実際のサンプル数が小さければ結果として100からずれる可能性が高いです。) エクセルでやるにはA列に =Rand() B列(B1)に、=(SQRT(2352*A1+49)-7)/2+86 として下にオートフィルすれば、例2の場合のサンプル分布が得られます。 実際にためしてみたところ、50個のサンプルだと平均値が98.4~100.5ぐらいになり、どうやらエクセルの乱数には0.5より小さい値が出る傾向が若干ながらあるみたいですね。 ちなみに、正規分布の乱数を発生する場合の例 http://www1.parkcity.ne.jp/yone/math/mathB03_06.htm http://homepage1.nifty.com/gfk/Norm-Rand.htm
- KURUMITO
- ベストアンサー率42% (1835/4283)
乱数を使って平均が100になるようにするのは面倒なことですが、次のようにしてできるだけ100に近い、あるいは100になる値段を出すことができます。 A1セルに平均値と書きB1セルに100と入力します。 A2セルには個数と入力しB2セルには45と入力します。 A3セルには分布幅と入力しB3セルに88、C3セルに107と入力します。 A4セルには=$B$1-A5と式を入力します。 A5セルには=AVERAGE(A6:A100)と式を入力します。 A6セルには次の式を入力し下方に(A100セルまででもよい)オートフィルドラッグします。 =IF(ROW(A1)>$B$2,"",RANDBETWEEN($B$3,$C$3)) この式でRANDBETWEEN関数は88と107の数値の間で乱数を発生させるものです。 A4セルから(個数が45の場合にはA50セルまでを範囲として選択してよい)A100セルまでを範囲として選択して右横方向に例えばCJ列までオートフィルドラッグします。列を多くとることが以後の操作を少なくする上でよい。 D1セルには次の式を入力します。 =MIN(4:4) E1セルには次の式を入力します。 =ADDRESS(4,MATCH(D1,4:4,0)) つまり6行より下の行で指定された分布幅での乱数を発生させ、その平均値を5行目に表示、指定の平均値からのずれを4行目に表示、D1セルにはそのずれが最も少ない値を表示、E1セルにはその最も少ない値のあるセル番地を表示させています。 この状態でキーボード上のF9ボタンを押します。押すたびに乱数が発生し、指定の平均値からのずれが変わります。ずれの値が0.1以下となればかなり平均値に近い値が乱数で得られたことになります。もちろんその値が0となれば望みの値ということになります。何回も繰り返すことで0になることもあります。一度試験してみてください。
- kmetu
- ベストアンサー率41% (562/1346)
ソルバーが近い雰囲気だと思われます。