- ベストアンサー
平均が違う!
こんにちはー( ^ー^)★ 正規分布の点が求められなくて、困ってます。 平均ともいうのかな? もしも、 Sub test() Cells.Clear nmax = 10 mmax = 10 For n = 1 To nmax For m = 1 To mmax Cells(n, 1) = Rnd Cells(n, 2) = Cells(n, 1) + Cells(n, 2) Next Cells(n, 2) = Cells(n, 2) / m Next End Sub この式では、 mが多ければ多いほど、正規分布(0.5に近い値)が求められますよね。 これと同じように、半径が5の時のXとYの進んだ距離の平均は、 Sub test() Cells.Clear nmax = 10 mmax = 10 dr = 5 For n = 1 To nmax For m = 1 To mmax theta = Rnd() * 2 * Pi x = x + dr * Cos(theta) y = y + dr * Sin(theta) Cells(n, 1) = x + Cells(n, 1) Cells(n, 2) = y + Cells(n, 2) Next Cells(n, 1) = Cells(n, 1) / m '足したXの数をmで割ります。 Cells(n, 2) = Cells(n, 2) / m '足したYの数をmで割ります。 Next End Sub と、なると思ったのですが、ぜんぜん違いました。 平均は、x、yともに5近くなるはずなんです。 なにが違っているのでしょうか? 教えてください! お願いいたします。
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
申し訳ありませんが、質問文が言葉足らずだと思います。 以下、質問文を推測して回答します。 『半径が5の時のXとYの進んだ距離の平均』とは、「半径5の円周上の点(X,Y)と中心との距離の平均」という意味ですか?(どこを「進んだ」のか、よくわかりません…) だとしたら、平均など求めるまでもなく、半径5なので距離は5です。 半径を算出して、それを10回足して10で割るプログラムを作ろうとしているのでしょうか? しかし、プログラムを読むと、「半径5の円周上の点(X,Y)をランダムに選んだときの(X,Y)の平均」を求めようとしているように見えます。なぜなら、距離である√(X*X+Y*Y)を計算しておらず、XとYの値を別々に足し算しているからです。 もし「半径5の円周上の点(X,Y)をランダムに選んだときの(X,Y)の平均」を求めようとしているのであれば、X、Yともに-5~+5であり、その中心は0なので、平均は(0,0)に近づくはずです。 しかし、このプログラムでは、それも求まらないでしょう。「Cells」と出てくるので、ExcelのVBAであるとして訂正箇所を挙げておきます(Excelが手元にないので確認してませんが…)。 まず、円周率と思われるPiに数値が入ってないので、theta=0のはずです。つまり、常にCos(theta)=1, Sin(theta)=0となり、ランダムな数値になりません。Piに円周率を入れてください。(ExcelのセルではPi()がサポートされているかと思いますが、VBAの中では使えなかったと思います) さらに、x, yをx, yに加えたあと、セルの値(古いx, yと同値)に加えるなど、余計な計算をしています。「Cells(n, 1) = dr * Cos(theta) + Cells(n, 1)」のみでよいはずです(xの場合)。 最後に、合計をmで割っていますが、mのForを終えたあと「m = 10」でしょうか?念のため、確認してみてください。mのForが終わったあと(Nextのあと)に、「Cells(n, 3) = m」を入れればわかります。たぶん、「m = 11」になっていると思います。これでは正しい平均が求まりません(上述の理由で未確認です。すみませんm(_ _)m)。こういときは、mmaxで割ったほうがわかりやすくて確実です。 ざっと見てわかるプログラムの間違いは以上です。 ところで、正規分布と平均を混同されているようですが、両者はまったく意味が異なります。数学の本などで確認してください。この質問の場合は「平均」が正しいです。
その他の回答 (2)
- miran_2006
- ベストアンサー率25% (29/116)
質問内容があまり纏まってない気がします。 質問をするときには、いきなり書き込むのではなくワードなどで一旦書いてからよく読みなおして点検してから書き込みしたほうがいいですよ。 ランダムな角度に応じた円周上の点のXYの平均値を求めたいと理解することにして、答えます。 平均値は0に近づくでしょう。 円の中心座標を考えれば分かりますよね。 下記はサンプルです。フォームにpictureboxを1個とtextboxを2個、ボタンを1個貼ってください。 Private Sub Command1_Click() Dim kaiX As Double Dim kaiY As Double Dim i As Integer Dim Pi As Double Dim x As Double Dim y As Double Dim xx As Double Dim yy As Double Dim s As Double Dim Rad As Double Pi = 3.14 '円周率 Rad = Pi * 2 / 360 'ラジアン単位 For i = 1 To 1000 'サンプリングのループ s = Rnd * 360 '0~360度の角度を乱数で求める s = s * Rad '角度をラジアンに変換 x = Cos(s) * 5 '角度に対するXを求める y = Sin(s) * 5 '角度に対するYを求める kaiX = kaiX + x 'Xの値を積算する kaiY = kaiY + y 'Yの値を積算する xx = x * 30 '半径5の円は表示しても見にくいので30倍にする yy = y * 30 Picture1.PSet (xx + 200, yy + 200), 0 '求めた値で絵を描く '但し、pictureboxは左上の座標が0,0なので200づつオフセットする Next Text1.Text = kaiX / 1000 '1000回のサンプリングだったので Text2.Text = kaiY / 1000 '1000で割って平均を求める End Sub
お礼
>Text1.Text = kaiX / 1000 '1000回のサンプリン>グだったので >Text2.Text = kaiY / 1000 '1000で割って平均を>求める が、ループの中に入っちゃいけないんですね! なんだか、それがわかってすっきりしました。 >。フォームにpictureboxを1個とtextboxを2個、ボタ >ンを1個貼ってください。 ということですが、、、、 フォームがまだいまいちわかてません。 もうすこし勉強します! ありがとうございます
- BLUEPIXY
- ベストアンサー率50% (3003/5914)
x = x + dr * Cos(theta) のように移動した位置を足しているから "平均は、x、yともに5近くなる" は、おかしいんじゃないかと思います。 それは、ともかく Pi は、 3.1415926 とかにしてみて下さい。
お礼
質問文が駄文でしたね、すみません。 今度からワードで確認しつつやります。 すばらしいご指摘の山ですね、 問題点を紙に書き出して、チャレンジします。 ”平均が5にならない” ということがカルチャーショックでした。 ありがとうございます