1
0

705_random.py 2.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142
  1. import random as r
  2. r.seed(10)
  3. for _ in range(100):
  4. i = r.randint(1, 10)
  5. assert i <= 10
  6. assert i >= 1
  7. i = r.random()
  8. assert 0.0 <= i <= 1.0
  9. i = r.uniform(3.0, 9.5)
  10. assert 3.0 <= i <= 9.5
  11. a = [1, 2, 3, 4]
  12. r.shuffle(a)
  13. for i in range(10):
  14. assert r.choice(a) in a
  15. for i in range(10):
  16. assert r.choice(tuple(a)) in a
  17. for i in range(10):
  18. assert r.choice('hello') in 'hello'
  19. for i in range(10):
  20. assert r.randint(1, 1) == 1
  21. # test choices
  22. x = (1,)
  23. res = r.choices(x, k=4)
  24. assert (res == [1, 1, 1, 1]), res
  25. w = (1, 2, 3)
  26. assert r.choices([1, 2, 3], (0.0, 0.0, 0.5)) == [3]
  27. try:
  28. r.choices([1, 2, 3], (0.0, 0.0, 0.5, 0.5))
  29. exit(1)
  30. except ValueError:
  31. pass
  32. try:
  33. r.choices([])
  34. exit(1)
  35. except IndexError:
  36. pass
  37. seq = [1, 2, 3, 4]
  38. weights = [0.1, 0.2, 0.2, 0.5]
  39. k = 1000
  40. res = r.choices(seq, weights, k=k)
  41. assert len(res) == k and isinstance(res, list)
  42. max_error = 0.03
  43. for i in range(len(seq)):
  44. actual_w = res.count(seq[i]) / k
  45. assert abs(actual_w - weights[i]) < max_error
  46. # test seed
  47. from random import randint, seed
  48. seed(7)
  49. a = randint(1, 100)
  50. b = randint(-2**60, 1)
  51. c = randint(50, 100)
  52. assert (a, b, c) == (16, -418020281577586157, 76)
  53. seed(7)
  54. assert a == randint(1, 100)
  55. assert b == randint(-2**60, 1)
  56. assert c == randint(50, 100)
  57. import random
  58. assert random.Random(7).randint(1, 100) == a
  59. # test getstate/setstate
  60. r = random.Random(7)
  61. for _ in range(5):
  62. r.random()
  63. state = r.getstate()
  64. assert isinstance(state, bytes)
  65. a = [r.randint(0, 1000) for _ in range(10)]
  66. r.setstate(state)
  67. assert a == [r.randint(0, 1000) for _ in range(10)]
  68. # a state can be moved between generators
  69. other = random.Random(123)
  70. other.setstate(r.getstate())
  71. assert other.random() == r.random()
  72. # `Random(state)` is equivalent to `setstate`
  73. assert random.Random(other.getstate()).random() == other.random()
  74. for bad in [b'', b'123', state[:-1]]:
  75. try:
  76. random.Random().setstate(bad)
  77. exit(1)
  78. except ValueError:
  79. pass
  80. try:
  81. random.Random().setstate(7)
  82. exit(1)
  83. except TypeError:
  84. pass
  85. # `mti` must stay within [0, 624+1]
  86. tmp = list(state)
  87. for mti in ([0xFF, 0xFF, 0xFF, 0xFF], [0x72, 0x02, 0, 0]):
  88. try:
  89. random.Random().setstate(bytes(tmp[:-4] + mti))
  90. exit(1)
  91. except ValueError:
  92. pass
  93. # module-level generator exposes the same api
  94. random.seed(456)
  95. state = random.getstate()
  96. a = [random.random() for _ in range(5)]
  97. random.setstate(state)
  98. assert a == [random.random() for _ in range(5)]
  99. # test pickle
  100. import pickle
  101. r = random.Random(7)
  102. for _ in range(5):
  103. r.random()
  104. r2 = pickle.loads(pickle.dumps(r))
  105. assert isinstance(r2, random.Random) and r2 is not r
  106. assert [r.random() for _ in range(10)] == [r2.random() for _ in range(10)]
  107. # an unseeded generator round-trips as unseeded
  108. fresh = random.Random()
  109. assert pickle.loads(pickle.dumps(fresh)).getstate() == fresh.getstate()
  110. # shared references are preserved
  111. res = pickle.loads(pickle.dumps([r, r]))
  112. assert res[0] is res[1]