Advertisement
Guest User

Untitled

a guest
Apr 20th, 2019
165
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 1.79 KB | None | 0 0
  1. class_name MT
  2.  
  3. const MATRIX_A   : int   = 0x9908b0df
  4. const UPPER_MASK : int = 0x80000000
  5. const LOWER_MASK : int = 0x7fffffff
  6.  
  7. var mt : Array = []
  8. var n  : int   = 624
  9. var m  : int   = 397
  10.  
  11. func _init(sd : int = 1337) :
  12.     self.mt.append(sd)
  13.     for i in range(1,624):
  14.         self.mt.append(self._int_32(1812433253 * (self.mt[i - 1] ^ (self.mt[i - 1] >> 30)) + i))
  15.  
  16. func _int_32(num : int) -> int :
  17.     return int(0xffffffff & num)
  18.  
  19. func twist() -> void :
  20.     var temp
  21.     var temp_shift
  22.     for i in range(624):
  23.         temp = self._int_32((self.mt[i] & self.UPPER_MASK) + (self.mt[(i + 1) % 624] & self.LOWER_MASK))
  24.         temp_shift = temp >> 1
  25.         if temp % 2 != 0:
  26.             temp_shift = temp_shift ^ self.MATRIX_A
  27.         self.mt[i] = self.mt[(i + self.m) % 624] ^ temp_shift
  28.     self.n = 0
  29.  
  30. # Generates a random number on [0,0xffffffff]-interval
  31. func random_int() -> int :
  32.     var y
  33.     if self.n >= 624:
  34.         self.twist()
  35.     y = self.mt[self.n]
  36.     y = y ^ (y >> 11)
  37.     y = y ^ ((y << 7) & 0x9d2c5680)
  38.     y = y ^ ((y << 15) & 0xefc60000)
  39.     y = y ^ (y >> 18)
  40.     self.n = self.n + 1
  41.     return self._int_32(y)
  42.  
  43. # Generates a random number on [0,0x7fffffff]-interval
  44. func random_int31() -> int :
  45.     return (self.random_int() >> 1)
  46.  
  47. # Generates a random number on [0,1]-real-interval
  48. func random_incl() -> float :
  49.     return self.random_int() * (1.0 / 4294967295.0)
  50.  
  51. # Generates a random number on [0,1)-real-interval
  52. func random() -> float :
  53.     return self.random_int() * (1.0 / 4294967296.0)
  54.  
  55. # Generates a random number on (0,1)-real-interval
  56. func random_excl() -> float :
  57.     return (self.random_int() + 0.5) * (1.0 / 4294967296.0)
  58.  
  59. # Generates a random number on [0,1) with 53-bit resolution
  60. func random_long() -> float :
  61.     var a = self.random_int() >> 5
  62.     var b = self.random_int() >> 6
  63.     return(a * 67108864.0 + b) * (1.0 / 9007199254740992.0)
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement