Navigation Menu

Skip to content

Instantly share code, notes, and snippets.

@turbo
Created October 15, 2015 14:22
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save turbo/4a76421ffb4f89d8becb to your computer and use it in GitHub Desktop.
Save turbo/4a76421ffb4f89d8becb to your computer and use it in GitHub Desktop.
VBMath Rnd() 1:1 Clone
' 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