VBA VBS System Random Class


#関数リスト

|関数名|説明|
|:----:|:------|
|RndINT32GenNext|0からInt32型の最大値＝Long型の最大値2147483647より小さい整数の乱数を生成|
|rngGen0Max(LongMaxNumber As Long)| 0以上LongMaxNumberより小さい整数の乱数を返す。ただし最大値2147483647より大きい場合や、マイナスや1より小さい場合は0を返す。|
|RndINT32GenInterval(LongFromNumber As Long, LongMaxNumber As Long)|LongFromNumber以上LongMaxNumber未満の整数。ただし最大値は上記と同じ。
|RndGen0To1|0.0以上1.0未満の倍精度浮動小数点数|

#VBA mscorelib参照設定版Class
mscorelib.tlbへの参照設定が必要です

```vb
Option Explicit
' Class Name = "cls_Genelic_Rnd"
' Ver20190223
Private Const MaxRandomInt16 As Long = 2147483647
Private mscoreLibInt32Rnd
Private Sub Class_Initialize()
Set mscoreLibInt32Rnd = New mscorlib.Random
'Set mscoreLibInt32Rnd = CreateObject("System.Random")
End Sub
Function rndgenNext()
rndgenNext = mscoreLibInt32Rnd.Next()
End Function

Function RndINT32NumberGen0toMax(LongMaxNumber As Long)
If LongMaxNumber <= MaxRandomInt16 Then
RndINT32NumberGen0toMax = mscoreLibInt32Rnd.Next_3(LongMaxNumber)
ElseIf LongMaxNumber < 0 Then
Debug.Print "RndINT32NumberGen0toMax error occur. この関数は0以上LongMaxNumber(長整数型,最大値2147483647)より小さい正の整数を返す関数です。マイナスなので0のみ返します"
RndINT32NumberGen0toMax = 0
ElseIf LongMaxNumber < 1 And LongMaxNumber >= 0 Then
Debug.Print "RndINT32NumberGen0toMax error occur. この関数は0以上LongMaxNumber(長整数型,最大値2147483647)より小さい正の整数を返す関数です。１より小さい数は生成できないので、０を返します"
RndINT32NumberGen0toMax = 0
End If
End Function

Function RndINT32GenInterval(LongFromNumber As Long, LongMaxNumber As Long)
If LongFromNumber < LongMaxNumber And LongMaxNumber <= MaxRandomInt16 Then
RndINT32GenInterval = mscoreLibInt32Rnd.Next_2(LongFromNumber, LongMaxNumber)
ElseIf LongMaxNumber < 0 Then
Debug.Print "RndINT32GenInterval error occur. この関数は0以上LongMaxNumber(長整数型,最大値2147483647)より小さい正の整数を返す関数です。マイナスなので0のみ返します"
RndINT32GenInterval = 0
ElseIf LongMaxNumber < 1 And LongMaxNumber >= 0 Then
Debug.Print "RndINT32GenInterval error occur. この関数は0以上LongMaxNumber(長整数型,最大値2147483647)より小さい正の整数を返す関数です。１より小さい数は生成できないので、０を返します"
RndINT32GenInterval = 0
End If
End Function
Function RndGen0To1() As Double
'0.0以上1.0未満の倍精度浮動小数点数
RndGen0To1 = mscoreLibInt32Rnd.Nextdouble
End Function
Private Sub Class_Terminate()
If Not mscoreLibInt32Rnd Is Nothing Then Set mscoreLibInt32Rnd = Nothing
End Sub
```
#VBA CreateOjbect版 Class
参照設定なしで動きます。

```vb
Option Explicit
' Class Name = "cls_Genelic_Rnd"
' Ver20190223
Private Const MaxRandomInt16 As Long = 2147483647
Private mscoreLibInt32Rnd

Private Sub Class_Initialize()
Set mscoreLibInt32Rnd = New mscorlib.Random
'Set mscoreLibInt32Rnd = CreateObject("System.Random")
End Sub

Function rndgenNext()
rndgenNext = mscoreLibInt32Rnd.Next()
End Function

Function RndINT32NumberGen0toMax(LongMaxNumber As Long)
If LongMaxNumber <= MaxRandomInt16 Then
RndINT32NumberGen0toMax = mscoreLibInt32Rnd.Next_3(LongMaxNumber)
ElseIf LongMaxNumber < 0 Then
Debug.Print "RndINT32NumberGen0toMax error occur. この関数は0以上LongMaxNumber(長整数型,最大値2147483647)より小さい正の整数を返す関数です。マイナスなので0のみ返します"
RndINT32NumberGen0toMax = 0
ElseIf LongMaxNumber < 1 And LongMaxNumber >= 0 Then
Debug.Print "RndINT32NumberGen0toMax error occur. この関数は0以上LongMaxNumber(長整数型,最大値2147483647)より小さい正の整数を返す関数です。１より小さい数は生成できないので、０を返します"
RndINT32NumberGen0toMax = 0
End If
End Function

Function RndINT32GenInterval(LongFromNumber As Long, LongMaxNumber As Long)
If LongFromNumber < LongMaxNumber And LongMaxNumber <= MaxRandomInt16 Then
RndINT32GenInterval = mscoreLibInt32Rnd.Next_2(LongFromNumber, LongMaxNumber)
ElseIf LongMaxNumber < 0 Then
Debug.Print "RndINT32GenInterval error occur. この関数は0以上LongMaxNumber(長整数型,最大値2147483647)より小さい正の整数を返す関数です。マイナスなので0のみ返します"
RndINT32GenInterval = 0
ElseIf LongMaxNumber < 1 And LongMaxNumber >= 0 Then
Debug.Print "RndINT32GenInterval error occur. この関数は0以上LongMaxNumber(長整数型,最大値2147483647)より小さい正の整数を返す関数です。１より小さい数は生成できないので、０を返します"
RndINT32GenInterval = 0
End If
End Function

Function RndGen0To1() As Double
'0.0以上1.0未満の倍精度浮動小数点数
RndGen0To1 = mscoreLibInt32Rnd.Nextdouble
End Function

Private Sub Class_Terminate()
If Not mscoreLibInt32Rnd Is Nothing Then Set mscoreLibInt32Rnd = Nothing
End Sub
```

###VBA 標準モジュール

```vb
Sub classGenericRandomSample()
Dim cRnd As New cls_Genelic_Rnd: Set cRnd = New cls_Genelic_Rnd
Debug.Print cRnd.RndINT32GenNext
Debug.Print cRnd.RndINT32NumberGen0toMax(10000)
Debug.Print cRnd.RndINT32GenInterval(200, 400)
Debug.Print cRnd.RndGen0To1
Set cRnd = Nothing
End Sub
```

##VBScript版

```vb
Option Explicit
Const MaxRandomInt16 = 2147483647

Class cls_Genelic_Rnd
' Class Name = "cls_Genelic_Rnd"
' Ver20190223

Private mscoreLibInt32Rnd

Private Sub Class_Initialize()
Set mscoreLibInt32Rnd = CreateObject("System.Random")
End Sub

Function RndINT32GenNext()
RndINT32GenNext = mscoreLibInt32Rnd.Next()
End Function

Function RndINT32NumberGen0toMax(LongMaxNumber)
If LongMaxNumber <= MaxRandomInt16 Then
RndINT32NumberGen0toMax = mscoreLibInt32Rnd.Next_3(LongMaxNumber)
ElseIf LongMaxNumber < 0 Then
Wscript.Echo "RndINT32NumberGen0toMax error occur. この関数は0以上LongMaxNumber(長整数型,最大値2147483647)より小さい正の整数を返す関数です。マイナスなので0のみ返します"
RndINT32NumberGen0toMax = 0
ElseIf LongMaxNumber < 1 And LongMaxNumber >= 0 Then
Wscript.Echo "RndINT32NumberGen0toMax error occur. この関数は0以上LongMaxNumber(長整数型,最大値2147483647)より小さい正の整数を返す関数です。１より小さい数は生成できないので、０を返します"
RndINT32NumberGen0toMax = 0
End If
End Function

Function RndINT32GenInterval(LongFromNumber, LongMaxNumber)
If LongFromNumber < LongMaxNumber And LongMaxNumber <= MaxRandomInt16 Then
RndINT32GenInterval = mscoreLibInt32Rnd.Next_2(LongFromNumber, LongMaxNumber)
ElseIf LongMaxNumber < 0 Then
Wscript.Echo  "RndINT32GenInterval error occur. この関数は0以上LongMaxNumber(長整数型,最大値2147483647)より小さい正の整数を返す関数です。マイナスなので0のみ返します"
RndINT32GenInterval = 0
ElseIf LongMaxNumber < 1 And LongMaxNumber >= 0 Then
Wscript.Echo "RndINT32GenInterval error occur. この関数は0以上LongMaxNumber(長整数型,最大値2147483647)より小さい正の整数を返す関数です。１より小さい数は生成できないので、０を返します"
RndINT32GenInterval = 0
End If
End Function

Function RndGen0To1()
'0.0以上1.0未満の倍精度浮動小数点数
RndGen0To1 = mscoreLibInt32Rnd.Nextdouble
End Function

Private Sub Class_Terminate()
If Not mscoreLibInt32Rnd Is Nothing Then Set mscoreLibInt32Rnd = Nothing
End Sub

End Class

Dim cRnd : Set cRnd = New cls_Genelic_Rnd
Wscript.Echo cRnd.RndINT32GenNext
Wscript.Echo cRnd.RndINT32NumberGen0toMax(10000)
Wscript.Echo cRnd.RndGen0To1
Wscript.Echo cRnd.RndINT32GenInterval(200, 400)

Set cRnd = Nothing
```
#参考文献
'[Randomクラスで乱数を作る](http://tokidokidokin.com/2011/03/vba%E3%81%A7-net-framework%E3%81%AEarraylist%E3%82%AF%E3%83%A9%E3%82%B9%E3%81%A8random%E3%82%AF%E3%83%A9%E3%82%B9%E3%82%92%E4%BD%BF%E3%81%86/)
'>Nextメソッド:0 以上の乱数を返します。
'>Next_3メソッド:指定した最大値より小さい 0 以上の乱数を返します。
'>Next_2メソッド: 指定した範囲内の乱数を返します｡
'>NextDoubleメソッド:0.0 と 1.0 の間の乱数を返します。
'[Random Class ](https://docs.microsoft.com/ja-jp/dotnet/api/system.random?redirectedfrom=MSDN&view=netframework-4.7.2)
'[Hey, Scripting Guy!: Be Careful What You Say(http://technet.microsoft.com/ja-jp/magazine/2007.01.heyscriptingguy.aspx)から移動](https://docs.microsoft.com/ja-jp/previous-versions/technet-magazine/cc162521(v=msdn.10))
'[Windows API Catalog へ移動したらしい http://msdn.microsoft.com/library/en-us/cpref/html/cpref_start.asp](https://docs.microsoft.com/ja-jp/previous-versions/ms123401(v=msdn.10))