fork download
  1. import random
  2.  
  3. A = [0,7,8,15,16,23,24,31]
  4. B = [1,2,3,4,5,6,25,26,27,28,29,30,9,17,22]
  5. C = [10,11,12,13,14,18,19,20,21]
  6.  
  7. if any(b in A for b in B) or any(c in A or c in B for c in C):
  8. raise RuntimeError('not valid input')
  9.  
  10.  
  11. def sample_k(k):
  12. ret = []
  13. counter = 0
  14. for _ in range(k):
  15. # select a group
  16. v = random.random()
  17. if v < .5:
  18. g = A
  19. elif v < .95:
  20. g = B
  21. else:
  22. g = C
  23.  
  24. while True:
  25. # select a num
  26. v = random.choice(g)
  27. counter += 1
  28. if v not in ret[-6:]:
  29. ret.append(v)
  30. break
  31. return ret, counter
  32.  
  33.  
  34. seq, count = sample_k(100000)
  35.  
  36. print('accept rate:', float(len(seq)) / count)
  37.  
  38. sets = [set(A), set(B), set(C)]
  39. group_count = [0] * 3
  40.  
  41. for v in seq:
  42. for i, s in enumerate(sets):
  43. if v in s:
  44. group_count[i] += 1
  45. break
  46.  
  47. group_prob = [float(p) / len(seq) for p in group_count]
  48. print(group_prob)
  49.  
Success #stdin #stdout 0.1s 71092KB
stdin
Standard input is empty
stdout
('accept rate:', 0.6822678583611926)
[0.50017, 0.45079, 0.04904]