C# と VB.NET の質問掲示板

わんくま同盟

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト


(過去ログ 18 を表示中)
■7008 / )  Re[4]: Long型の乱数を生成する自作クラスをつくりたい
□投稿者/ ぼのぼの (74回)-(2007/08/28(Tue) 18:04:38)
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

解決済み
返信 編集キー/


管理者用

- Child Tree -