こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

解決済みの質問

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

投稿日時 - 2018-06-15 20:54:15

QNo.9508655

暇なときに回答ください

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

おそらく正しくは

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個作成しています。

投稿日時 - 2018-06-15 21:58:44

お礼

御回答に感謝致します。

投稿日時 - 2018-06-29 14:48:46

このQ&Aは役に立ちましたか?

0人が「このQ&Aが役に立った」と投票しています

回答(4)

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

投稿日時 - 2018-06-29 18:46:18

お礼

有難うございます。

投稿日時 - 2018-09-02 18:23:06

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

投稿日時 - 2018-06-16 07:25:18

お礼

有難う御座います。

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

投稿日時 - 2018-06-29 14:43:51

ANo.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
------------------------

これから先は、自分で考えてください。

投稿日時 - 2018-06-15 21:44:19

お礼

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

投稿日時 - 2018-06-29 14:48:10

あなたにオススメの質問