• ベストアンサー

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行目では何が行われているのでしょうか。 易しく、教えて頂けると、助かります。 宜しくお願い致します。

質問者が選んだベストアンサー

  • ベストアンサー
  • HohoPapa
  • ベストアンサー率65% (455/693)
回答No.2

おそらく正しくは 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個作成しています。

noname#233045
質問者

お礼

御回答に感謝致します。

その他の回答 (3)

  • miso_kasu
  • ベストアンサー率60% (6/10)
回答No.4

>だが、単数浮動小数点型は< -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の間に扱える単精度浮動小数点の値が無いということでしょう。 表現としては紛らわしいですね。

noname#233045
質問者

お礼

有難うございます。

  • miso_kasu
  • ベストアンサー率60% (6/10)
回答No.3

>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関数で切り捨てます。

noname#233045
質問者

お礼

有難う御座います。 Rnd関数は、仰る通り、0以上1未満の単精度浮動小数点型の値を返すと有る。 だが、単数浮動小数点型は< -3.4028235E+38 ~ -1.401298E-45、1.401298E-45 ~ 3.4028235E+38>の範囲の値を取ると有る。此の範囲には、0以上1未満の値が含まれていない様に思う。 此処は、どの様に考えるべきでしょう。

回答No.1

理解するには、コードを分解してテストするといいですよ。例えば、次のような要領で。 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 ------------------------ これから先は、自分で考えてください。

noname#233045
質問者

お礼

回答にお礼申し上げます。