Oppure

Loading
03/10/14 12:03
amreo
  Public Class LCGRandom
        '[Inherits BaseRandom]

        Protected Const A As Decimal = 214013
        Protected Const C As Decimal = 2531011
        Protected Const M As Decimal = 2 ^ 32

        Protected seed As Decimal

        ''' <summary>
        ''' Crea una nuova istanza di LCGRandom
        ''' </summary>
        Public Sub New()
            'crea il seed
            seed = Lowest64Bit(Now.Ticks + Now.ToBinary + Now.TimeOfDay.TotalMilliseconds + Now.TimeOfDay.TotalSeconds)
        End Sub
        ''' <summary>
        ''' Crea una nuova istanza di LCGRandom
        ''' </summary>
        Public Sub New(seed As ULong)
            'imposta il seed
            Me.seed = seed
        End Sub

        ''' <summary>
        ''' Scarta un numero pseudo-casuale
        ''' </summary>
        Public Overrides Sub [Next]()
            'ricalcola il seed
            seed = Lowest64Bit((seed * A + C) Mod M)
        End Sub

        ''' <summary>
        ''' Genera un byte pseudo-casuale
        ''' </summary>
        ''' <remarks>Il numero pseudo-casuale generato è compreso tra 0 e 255</remarks>
        ''' <returns>Un byte pseudo-casuale</returns>
        Public Overrides Function NextByte() As Byte
            'imposta nextByte
            NextByte = seed Mod 256
            'scarta un numero
            [Next]()
        End Function
        ''' <summary>
        ''' Genera un numero double pseudo-casuale
        ''' </summary>
        ''' <remarks>Il numero pseudo-casuale generato ha un valore compreso tra 0.0 e 1.0</remarks>
        ''' <returns>Un numero double pseudo-casuale</returns>
        Public Overrides Function NextDouble() As Double
            'imposta nextDouble
            NextDouble = seed / M
            'scarta un numero
            [Next]()
        End Function
        ''' <summary>
        ''' Genera un numero intero pseudo-casuale
        ''' </summary>
        ''' <remarks>Il numero generato è compreso tra <see cref="Int32.MinValue">Integer.MinValue</see> e <see cref="Int32.MaxValue">Integer.MaxValue</see></remarks>
        ''' <returns>Un numero intero</returns>
        Public Overloads Overrides Function NextInt() As Integer
            'calcola nextint
            NextInt = seed Mod (UInteger.MaxValue + 1) + Integer.MinValue
            'scarta un numero
            [Next]()
        End Function
        ''' <summary>
        ''' Genera un numero intero pseudo-casuale
        ''' </summary>
        ''' <remarks>
        ''' Il numero generato ha un valore compreso tra
        ''' 0 e <paramref name="maxValue">maxValue</paramref>
        ''' </remarks>
        ''' <param name="maxValue">Massimo valore che il RNG può generare</param>
        ''' <returns>Un numero intero</returns>
        Public Overloads Overrides Function NextInt(maxValue As Integer) As Integer
            'calcola nextint
            NextInt = seed Mod (maxValue + 1)
            'scarta un numero
            [Next]()
        End Function
        ''' <summary>
        ''' Genera un numero intero pseudo-casuale
        ''' </summary>
        ''' <remarks>Il numero intero generato ha un valore compreso tra <paramref name="minValue">minValue</paramref> e <paramref name="maxValue">maxValue</paramref></remarks>
        ''' <param name="minValue">Il numero più piccolo che il RNG può generare</param>
        ''' <param name="maxValue">Il numero più grande che il RNG può generare.</param>
        ''' <returns>Un numero intero pseudo-casuale</returns>
        Public Overloads Overrides Function NextInt(minValue As Integer, maxValue As Integer) As Integer
            'calcola nextint
            NextInt = (seed Mod (maxValue - minValue + 1)) + minValue
            'scarta un numero
            [Next]()
        End Function
        ''' <summary>
        ''' Genera un numero intero pseudo-casuale
        ''' </summary>
        ''' <remarks>Il numero intero generato ha un valore compreso nel <paramref name="rng">range</paramref></remarks>
        ''' <param name="rng">Range in cui è compreso il numero</param>
        ''' <returns>Un numero intero pseudo-casuale</returns>
        Public Overloads Overrides Function NextInt(rng As Range) As Integer
            'calcola nextint
            NextInt = seed Mod (rng.Max + 1) + rng.Min
            'scarta un numero
            [Next]()
        End Function
        ''' <summary>
        ''' Genera un SByte pseudo-casuale
        ''' </summary>
        ''' <remarks>Il numero generato è compreso tra -127 e 128</remarks>
        ''' <returns>Un SByte pseudo-casuale</returns>
        Public Overrides Function NextSByte() As SByte
            'calcola nextint
            NextSByte = seed Mod (Byte.MaxValue + 1) + SByte.MinValue
            'scarta un numero
            [Next]()
        End Function
        ''' <summary>
        ''' Genera un numero single pseudo-casuale
        ''' </summary>
        ''' <remarks>Il numero single generato è compreso tra 0.0 e 1.0</remarks>
        ''' <returns>Un numero single pseudo-casuale</returns>
        Public Overrides Function NextSingle() As Single
            'calcola nextint
            NextSingle = seed / M
            'scarta un numero
            [Next]()
        End Function
        ''' <summary>
        ''' Genera un numero intero pseudo-casuale
        ''' </summary>
        ''' <remarks>Il numero intero ha un valore compreso tra 0 e <see cref="UInt32.MaxValue">UInt32.MaxValue</see></remarks>
        ''' <returns>Un numero intero pseudo-casuale</returns>
        Public Overrides Function NextUInt() As UInteger
            'calcola nextint
            NextUInt = seed Mod (UInteger.MaxValue + 1)
            'scarta un numero
            [Next]()
        End Function

        ''' <summary>
        ''' Restituisce il numero decimale solo con i lowest-64bit
        ''' </summary>
        ''' <param name="num">Numero</param>
        ''' <returns>Il numero decimale solo con i lowest-64bit</returns>
        Protected Shared Function Lowest64Bit(ByVal num As Decimal) As Decimal
            'calcola gli interi del numero
            Dim bits() As Integer = Decimal.GetBits(num)
            'restituisce il nuovo decimale
            Return New Decimal(bits(0), bits(1), 0, False, 0)
        End Function
    End Class


Non riesco a capire perchè mi escono sequenze uguali...
aaa