- ベストアンサー
Int((100-1+1)*Rnd+1)
Dim i As Integer, mS(9) As String For i = 0 To 9 mS(i) = Int((100-1+1)*Rnd+1) Next i 3行目では何が行われているのでしょうか。 易しく、教えて頂けると、助かります。 宜しくお願い致します。
- みんなの回答 (4)
- 専門家の回答
質問者が選んだベストアンサー
おそらく正しくは Dim i As Integer, mS(9) As integer For i = 0 To 9 mS(i) = Int((100-1+1)*Rnd+1) Next i で、 更に、無駄を排除して Dim i As Integer, mS(9) As integer For i = 0 To 9 mS(i) = Int((100)*Rnd+1) Next i と思います。 https://msdn.microsoft.com/ja-jp/VBA/language-reference-vba/articles/rnd-function?f1url=https%3A%2F%2Fmsdn.microsoft.com%2Fquery%2Fdev11.query%3FappId%3DDev11IDEF1%26l%3Dja-JP%26k%3Dk(vblr6.chm1009008)%3Bk(TargetFrameworkMoniker-Office.Version%3Dv16)%26rd%3Dtrue に説明があります。 Dim i As Integer, mS(9) As Integer For i = 0 To 9 mS(i) = Int((100) * Rnd + 1) MsgBox (Format(mS(i), "0")) Next i として何度か実行するとわかると思います。 ランダムな、1から100の間の数を10個作成しています。
その他の回答 (3)
- miso_kasu
- ベストアンサー率60% (6/10)
>だが、単数浮動小数点型は< -3.4028235E+38 ~ -1.401298E-45、1.401298E-45 ~ 3.4028235E+38>の範囲の値を取ると有る。此の範囲には、0以上1未満の値が含まれていない様に思う。 あなたの勘違いです。 1.401298E-45 は限りなく0に近い小数です。(1よりはるかに小さい値) 1.401298E-4(1.401298×1÷10⁴ → 0.000140298)より10桁以上小さい値なので0以上1未満の値が含まれています。 しかし、コンピューターで扱う数値はデジタルなので0と1.401298E43の間に扱える単精度浮動小数点の値が無いということでしょう。 表現としては紛らわしいですね。
お礼
有難うございます。
- miso_kasu
- ベストアンサー率60% (6/10)
>3行目では何が行われているのでしょうか。 3行目の数式(mS(i) = Int((100-1+1)*Rnd+1)は配列変数のmSのi(0~9)番目に100以下で1以上の整数の乱数を代入しています。 Rnd関数は1未満の値の乱数を発生させていますので100倍して1を加算すると1から100までの値になり、代入先のmSはInteger(整数)であることを宣言していますので1未満の端数はint関数で切り捨てます。
お礼
有難う御座います。 Rnd関数は、仰る通り、0以上1未満の単精度浮動小数点型の値を返すと有る。 だが、単数浮動小数点型は< -3.4028235E+38 ~ -1.401298E-45、1.401298E-45 ~ 3.4028235E+38>の範囲の値を取ると有る。此の範囲には、0以上1未満の値が含まれていない様に思う。 此処は、どの様に考えるべきでしょう。
- 山田 太郎(@f_a_007)
- ベストアンサー率20% (955/4574)
理解するには、コードを分解してテストするといいですよ。例えば、次のような要領で。 Private Sub コマンド2_Click() Dim I As Integer Dim V As Single For I = 0 To 1 V = Rnd Debug.Print "------------------------" Debug.Print "V=" & Format(V, "0.00000") Debug.Print "V*100=" & Format(V * 100, "0.00000") Debug.Print "V*100+1=" & Format(V * 100 + 1, "0.00000") Debug.Print "V*100+1=" & Format(int(V * 100 + 1), "0.00000") Next I Debug.Print "------------------------" End Sub イミディエイトウインドウを開くと、そこには・・・ ------------------------ V=0.91372 V*100=91.37176 V*100+1=92.37176 int(V*100+1)=92.00000 ------------------------ V=0.83482 V*100=83.48172 V*100+1=84.48172 int(V*100+1)=84.00000 ------------------------ これから先は、自分で考えてください。
お礼
回答にお礼申し上げます。
お礼
御回答に感謝致します。