- 締切済み
VBAの乱数について質問
乱数 x (0<x<1)を0.1刻みで発生させたいんですが うまくいきません。 プログラム例 Sub 一様乱数() Dim bin#(10) n = 1000 For m = 1 To 10 bin#(m) = 0 Next m For J = 1 To n x = Rnd(1) ix = Int(10 * Rnd(1)) bin#(ix) = bin#(ix) + 1 Next J Cells(4, 1) = " I" Cells(4, 2) = "Bin#(I)度数分布" For I = 0 To 10 Cells(I + 5, 1).Value = I Cells(I + 5, 2).Value = bin#(I) Next I End Sub ここで、9行目ix = Int(10 * Rnd(1))で0.1刻みになり 15行目のFor I = 0 To 10を0 to 1に変えればできると思ったんですが できませんでした。 どこが問題なのかヒントでもいいので教えてください。
- みんなの回答 (5)
- 専門家の回答
みんなの回答
- keikan
- ベストアンサー率42% (75/176)
>ここで、9行目ix = Int(10 * Rnd(1))で0.1刻みになり >15行目のFor I = 0 To 10を0 to 1に変えればできると>思ったんですが >できませんでした。 ここで、 Int(10 * Rnd(1))が生成する値は0以上10未満です。 また、For文の0 TO 10は0から10まで実行しますが、0 TO 1 は0から1までの実行になります。 STEP 0.1 とすれば0.1ずつ Iはかわって行きますが、次の行のCells文でエラーになります。
- laputart
- ベストアンサー率34% (288/843)
ご質問の意味がx (0<x<1) つまり 0.1--- 0.9を 得たいというのなら以下のようにしたらいかがですか。ついでにN数も入力出来るようにしました。 (よけいなお世話ですみません) Sub test() Dim bunpu(11) As Integer '乱数の初期化(シード) Randomize Timer n = InputBox("試行回数の入力 例 1000") For j = 1 To n x = Int(Rnd * 9) / 10 + 0.1 ix = Int(x * 10) + 1 bunpu(ix) = bunpu(ix) + 1 Next j Cells(4, 1) = " I" Cells(4, 2) = "Bunpu(I)度数分布" K = 0 For i = 1 To 11 Cells(i + 5, 1).Value = K Cells(i + 5, 2).Value = bunpu(i) K = K + 0.1 Next i End Sub
#2です。訂正します。 >Rnd関数の結果が0や1のような特定の数になるのは、極めてまれ >です。Int関数で切り捨てていますので、実際には0は発生します >が、1はほとんど発生しません。 これを以下のように訂正します。 RND関数は0 以上、1 未満の範囲を返しますので、1は発生しません。 >したがって、ix = Int(10.9999 * Rnd(1))にすれば、ほぼ望み >の結果が得られるのではないでしょうか。 したがって、ix = Int(11 * Rnd(1))にすれば、ほぼ望みの結果が得られるのではないでしょうか。 失礼しました。
質問の意味が取りにくいのですが、実行すると度数分布で10が0になるというのが、ご自身で問題と考えられているところでしょうか? 確かに、ix = Int(10 * Rnd(1))で0.1刻みを10倍した数値になるでしょうが、Rnd関数の結果が0や1のような特定の数になるのは、極めてまれです。Int関数で切り捨てていますので、実際には0は発生しますが、1はほとんど発生しません。 したがって、ix = Int(10.9999 * Rnd(1))にすれば、ほぼ望みの結果が得られるのではないでしょうか。 >15行目のFor I = 0 To 10を0 to 1に変えればできる ここは何を意図されているのか全く分かりませんが、0.1刻みであることを明示したいのなら、For I = 0 To 10は変更せずに、次行を Cells(I + 5, 1).Value = I / 10 にすればよろしいのでは?
- hana-hana3
- ベストアンサー率31% (4940/15541)
INT()関数を使っている限り、小数値を得る事はできません。