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