Created
October 15, 2015 14:22
-
-
Save turbo/4a76421ffb4f89d8becb to your computer and use it in GitHub Desktop.
VBMath Rnd() 1:1 Clone
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
' removed Compiler dependcies. | |
Public NotInheritable Class VBMathCLE | |
Private Shared Power2 As Integer() | |
Private Shared m_rndSeed As Integer | |
Shared Sub New() | |
Dim numArray() As Integer = {0, 2, 4, 8, 16, 32, 64, 128, 256, 512, 1024, 2048, 4096, 8192, 16384, 32768, 65536, 131072, 262144, 524288, 1048576, 2097152, 4194304, 8388608, 16777216, 33554432, 67108864, 134217728, 268435456, 536870912, 1073741824} | |
Power2 = numArray | |
End Sub | |
Private Shared Function GetTimer() As Single | |
Dim now As DateTime = DateTime.Now | |
Return CSng((CDbl(((60 * now.Hour + now.Minute) * 60 + now.Second)) + CDbl(now.Millisecond) / 1000)) | |
End Function | |
Public Shared Sub Randomize() | |
Dim timer As Single = GetTimer() | |
Dim mRndSeed As Integer = m_rndSeed | |
Dim num As Integer = BitConverter.ToInt32(BitConverter.GetBytes(timer), 0) | |
num = ShiftLeft(num And 65535 Xor ShiftRight(num, 16), 8) | |
m_rndSeed = mRndSeed And -16776961 Or num | |
End Sub | |
Public Shared Sub Randomize(ByVal Number As Double) | |
Dim num As Integer | |
Dim mRndSeed As Integer = m_rndSeed | |
num = If(Not BitConverter.IsLittleEndian, BitConverter.ToInt32(BitConverter.GetBytes(Number), 0), BitConverter.ToInt32(BitConverter.GetBytes(Number), 4)) | |
num = ShiftLeft(num And 65535 Xor ShiftRight(num, 16), 8) | |
mRndSeed = mRndSeed And -16776961 Or num | |
m_rndSeed = mRndSeed | |
End Sub | |
Public Shared Function Rnd() As Single | |
Return Rnd(1.0!) | |
End Function | |
Public Shared Function Rnd(ByVal Number As Single) As Single | |
Dim mRndSeed As Integer = m_rndSeed | |
If (CDbl(Number) <> 0) Then | |
If (CDbl(Number) < 0) Then | |
mRndSeed = BitConverter.ToInt32(BitConverter.GetBytes(Number), 0) | |
Dim num As Long = CLng(mRndSeed) | |
num = num And 4294967295L | |
mRndSeed = CInt((num + num / 16777216L And 16777215L)) | |
End If | |
mRndSeed = CInt((CLng(mRndSeed) * 1140671485L + 12820163L And 16777215L)) | |
End If | |
m_rndSeed = mRndSeed | |
Return CSng(mRndSeed) / 16777216.0! | |
End Function | |
Private Shared Function ShiftLeft(ByVal value As Integer, ByVal shift As Integer) As Integer | |
Dim power2 As Long = CLng(value) | |
power2 = power2 * CLng(VBMathCLE.Power2(shift)) | |
power2 = power2 And 4294967295L | |
If ((power2 And 2147483648L) <> 0L) Then | |
power2 = power2 Or -4294967296L | |
End If | |
Return CInt(power2) | |
End Function | |
Private Shared Function ShiftRight(ByVal value As Integer, ByVal shift As Integer) As Integer | |
Dim power2 As Long = CLng((value And 2147483647)) | |
If ((value And -2147483648) <> 0) Then | |
power2 = power2 Or 2147483648L | |
End If | |
power2 = power2 / CLng(VBMathCLE.Power2(shift)) | |
Return CInt(power2) | |
End Function | |
End Class |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment