import random
A = [0,7,8,15,16,23,24,31]
B = [1,2,3,4,5,6,25,26,27,28,29,30,9,17,22]
C = [10,11,12,13,14,18,19,20,21]
if any(b in A for b in B) or any(c in A or c in B for c in C):
raise RuntimeError('not valid input')
def sample_k(k):
ret = []
counter = 0
for _ in range(k):
# select a group
v = random.random()
if v < .5:
g = A
elif v < .95:
g = B
else:
g = C
while True:
# select a num
v = random.choice(g)
counter += 1
if v not in ret[-6:]:
ret.append(v)
break
return ret, counter
seq, count = sample_k(100000)
print('accept rate:', float(len(seq)) / count)
sets = [set(A), set(B), set(C)]
group_count = [0] * 3
for v in seq:
for i, s in enumerate(sets):
if v in s:
group_count[i] += 1
break
group_prob = [float(p) / len(seq) for p in group_count]
print(group_prob)
aW1wb3J0IHJhbmRvbQogCkEgPSBbMCw3LDgsMTUsMTYsMjMsMjQsMzFdCkIgPSBbMSwyLDMsNCw1LDYsMjUsMjYsMjcsMjgsMjksMzAsOSwxNywyMl0KQyA9IFsxMCwxMSwxMiwxMywxNCwxOCwxOSwyMCwyMV0KCmlmIGFueShiIGluIEEgZm9yIGIgaW4gQikgb3IgYW55KGMgaW4gQSBvciBjIGluIEIgZm9yIGMgaW4gQyk6CiAgICByYWlzZSBSdW50aW1lRXJyb3IoJ25vdCB2YWxpZCBpbnB1dCcpCiAKIApkZWYgc2FtcGxlX2soayk6CiAgICByZXQgPSBbXQogICAgY291bnRlciA9IDAKICAgIGZvciBfIGluIHJhbmdlKGspOgogICAgICAgICMgc2VsZWN0IGEgZ3JvdXAKICAgICAgICB2ID0gcmFuZG9tLnJhbmRvbSgpCiAgICAgICAgaWYgdiA8IC41OgogICAgICAgICAgICBnID0gQQogICAgICAgIGVsaWYgdiA8IC45NToKICAgICAgICAgICAgZyA9IEIKICAgICAgICBlbHNlOgogICAgICAgICAgICBnID0gQwoKICAgICAgICB3aGlsZSBUcnVlOgogICAgICAgICAgICAjIHNlbGVjdCBhIG51bQogICAgICAgICAgICB2ID0gcmFuZG9tLmNob2ljZShnKQogICAgICAgICAgICBjb3VudGVyICs9IDEKICAgICAgICAgICAgaWYgdiBub3QgaW4gcmV0Wy02Ol06CiAgICAgICAgICAgICAgICByZXQuYXBwZW5kKHYpCiAgICAgICAgICAgICAgICBicmVhawogICAgcmV0dXJuIHJldCwgY291bnRlcgogCiAKc2VxLCBjb3VudCA9IHNhbXBsZV9rKDEwMDAwMCkKCnByaW50KCdhY2NlcHQgcmF0ZTonLCBmbG9hdChsZW4oc2VxKSkgLyBjb3VudCkKCnNldHMgPSBbc2V0KEEpLCBzZXQoQiksIHNldChDKV0KZ3JvdXBfY291bnQgPSBbMF0gKiAzCgpmb3IgdiBpbiBzZXE6CiAgICBmb3IgaSwgcyBpbiBlbnVtZXJhdGUoc2V0cyk6CiAgICAgICAgaWYgdiBpbiBzOgogICAgICAgICAgICBncm91cF9jb3VudFtpXSArPSAxCiAgICAgICAgICAgIGJyZWFrCgpncm91cF9wcm9iID0gW2Zsb2F0KHApIC8gbGVuKHNlcSkgZm9yIHAgaW4gZ3JvdXBfY291bnRdCnByaW50KGdyb3VwX3Byb2IpCg==