2007/08/28(Tue) 18:08:00 編集(投稿者)
とりあえず、こんなのできました。突っ込みなどありましたら遠慮なくお願いします。
#一応解決済みつけときますが、消えちゃっても構いません。
Public Class LongRandom
Private _Random As New Random
Public Function [Next](ByVal min As Long, ByVal max As Long) As Long
'最小値の方が大きかったら例外を投げる
If min > max Then Throw New ArgumentOutOfRangeException()
'最小値と最大値が同じならその数を返す
If min = max Then Return min
'Long型の乱数を生成
Dim b() As Byte = BitConverter.GetBytes(0L)
_Random.NextBytes(b)
Dim l As Long = BitConverter.ToInt64(b, 0)
'値の絞込み
If min <= l AndAlso l <= max Then
'範囲内に収まっている場合はそのまま返す
Return l
Else
'範囲内に収まっていない場合、まず絶対値の大きい方で割った余りを求める
Dim biggerAbs As Long
If min = Long.MinValue Then
biggerAbs = Math.Max(Math.Abs(min + 1), Math.Abs(max))
Else
biggerAbs = Math.Max(Math.Abs(min), Math.Abs(max))
End If
l = l Mod biggerAbs
'範囲内になったらそのまま返す
If min <= l AndAlso l <= max Then
Return l
End If
'最小値と最大値の符号が異なる場合は、-1をかけた値を返す
If min < 0 AndAlso max <= 0 Then
Return l * -1
End If
'最小値と最大値の符号が同じ場合
Dim isMinus As Boolean = False
If min < 0 AndAlso max < 0 Then
isMinus = True
If min = Long.MinValue Then min = (min + 1) * -1 Else min = min * -1
max = max * -1
Dim tmp As Long = max
max = min
min = tmp
End If
If l = Long.MinValue Then l = (l + 1) * -1 Else l = Math.Abs(l)
l = min + l Mod (max - min)
If isMinus Then
Return l * -1
End If
Return l
End If
End Function
End Class