Advertisement
Guest User

Untitled

a guest
Jan 5th, 2019
138
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 1.57 KB | None | 0 0
  1. #!/usr/bin/env python2
  2. # -*- coding: utf-8 -*-
  3. """
  4. Generates uniformly distributed 32-bit integers in the range [0, 232 − 1] with the MT19937 algorithm
  5. """
  6. # Create a length 624 list to store the state of the generator
  7. MT = [0 for i in xrange(624)]
  8. index = 0
  9.  
  10. # To get last 32 bits
  11. bitmask_1 = (2 ** 32) - 1
  12.  
  13. # To get 32. bit
  14. bitmask_2 = 2 ** 31
  15.  
  16. # To get last 31 bits
  17. bitmask_3 = (2 ** 31) - 1
  18.  
  19. def initialize_generator(seed):
  20. "Initialize the generator from a seed"
  21. global MT
  22. global bitmask_1
  23. MT[0] = seed
  24. for i in xrange(1,624):
  25. MT[i] = ((1812433253 * MT[i-1]) ^ ((MT[i-1] >> 30) + i)) & bitmask_1
  26.  
  27.  
  28. def extract_number():
  29. """
  30. Extract a tempered pseudorandom number based on the index-th value,
  31. calling generate_numbers() every 624 numbers
  32. """
  33. global index
  34. global MT
  35. if index == 0:
  36. generate_numbers()
  37. y = MT[index]
  38. y ^= y >> 11
  39. y ^= (y << 7) & 2636928640
  40. y ^= (y << 15) & 4022730752
  41. y ^= y >> 18
  42.  
  43. index = (index + 1) % 624
  44. return y
  45.  
  46. def generate_numbers():
  47. "Generate an array of 624 untempered numbers"
  48. global MT
  49. for i in xrange(624):
  50. y = (MT[i] & bitmask_2) + (MT[(i + 1 ) % 624] & bitmask_3)
  51. MT[i] = MT[(i + 397) % 624] ^ (y >> 1)
  52. if y % 2 != 0:
  53. MT[i] ^= 2567483615
  54.  
  55. if __name__ == "__main__":
  56. from datetime import datetime
  57. now = datetime.now()
  58. initialize_generator(now.microsecond)
  59. for i in xrange(100):
  60. "Print 100 random numbers as an example"
  61. print extract_number()
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement