準・究極の選択

乱数 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に変えればできると思ったんですが
できませんでした。

どこが問題なのかヒントでもいいので教えてください。

A 回答 (5件)

>ここで、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文でエラーになります。
    • good
    • 0

ご質問の意味が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
    • good
    • 0

#2です。

訂正します。
>Rnd関数の結果が0や1のような特定の数になるのは、極めてまれ
>です。Int関数で切り捨てていますので、実際には0は発生します
>が、1はほとんど発生しません。
これを以下のように訂正します。
RND関数は0 以上、1 未満の範囲を返しますので、1は発生しません。
>したがって、ix = Int(10.9999 * Rnd(1))にすれば、ほぼ望み
>の結果が得られるのではないでしょうか。
したがって、ix = Int(11 * Rnd(1))にすれば、ほぼ望みの結果が得られるのではないでしょうか。

失礼しました。
    • good
    • 0

質問の意味が取りにくいのですが、実行すると度数分布で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
にすればよろしいのでは?
    • good
    • 0

INT()関数を使っている限り、小数値を得る事はできません。

    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!