>>> import random
>>>
>>> def f(n, r1, r2):
... assert r1 > 0 and r2 > 0
... out = []
... el = (0, 1)
... er = [0, 0]
... for _ in range(n):
... while True:
... e = random.choice(el)
... if e == el[0]:
... er[0] += 1
... er[1] = 0
... else:
... er[1] += 1
... er[0] = 0
... if (e == el[0] and er[0] <= r1) or \
... (e == el[1] and er[1] <= r2):
... out.append(e)
... break
... return out
...
>>> f(200, 4, 2)
[0, 1, 0, 0, 0, 1, 0, 0, 1, 0, 0, 1, 0, 1, 0, 1, 1, 0, 1, 0, 0, 0, 1, 1, 0, 1, 0, 1, 0, 1, 0, 0, 0, 0, 1, 1, 0, 0, 0, 1, 0, 1, 1, 0, 0, 1, 1, 0, 0, 1, 0, 0, 0, 0, 1, 0, 1, 0, 1, 1, 0, 0, 0, 1, 0, 1, 1, 0, 1, 1, 0, 0, 1, 0, 1, 0, 1, 1, 0, 1, 1, 0, 1, 0, 0, 0, 0, 1, 0, 1, 0, 0, 1, 1, 0, 0, 1, 1, 0, 1, 0, 1, 1, 0, 1, 0, 0, 1, 1, 0, 0, 1, 0, 0, 0, 1, 1, 0, 1, 0, 0, 0, 0, 1, 0, 0, 1, 0, 1, 1, 0, 1, 1, 0, 1, 0, 1, 1, 0, 1, 1, 0, 0, 1, 1, 0, 0, 1, 1, 0, 1, 1, 0, 1, 0, 0, 0, 1, 0, 0, 1, 1, 0, 0, 0, 1, 0, 0, 1, 1, 0, 0, 0, 1, 0, 1, 1, 0, 0, 1, 0, 0, 0, 1, 1, 0, 1, 1, 0, 0, 1, 1, 0, 0, 0, 1, 0, 0, 0, 1]
>>>
Add
Немного параметризовал:
>>> import random
>>>
>>> def f(el=(), er=(), n=0):
... assert len(el) == len(er)
... out = []
... r = [0] * len(el)
... for _ in range(n):
... while True:
... e = random.choice(el)
... i = el.index(e)
... t = r[i] + 1
... r = [0] * len(r)
... r[i] = t
... if t <= er[i]:
... out.append(e)
... break
... return out
...
>>> f('01', (4, 2), 200)
['0', '1', '0', '1', '1', '0', '0', '1', '1', '0', '1', '1', '0', '1', '1', '0', '0', '0', '0', '1', '1', '0', '0', '1', '1', '0', '0', '1', '0', '0', '0', '0', '1', '1', '0', '0', '1', '1', '0', '1', '0', '0', '1', '1', '0', '0', '0', '0', '1', '0', '1', '1', '0', '0', '1', '0', '0', '0', '1', '1', '0', '1', '0', '1', '1', '0', '1', '0', '0', '0', '0', '1', '0', '0', '0', '1', '0', '0', '1', '1', '0', '1', '0', '0', '1', '0', '0', '0', '1', '1', '0', '0', '0', '1', '1', '0', '0', '0', '1', '1', '0', '0', '0', '1', '0', '1', '1', '0', '0', '0', '0', '1', '0', '0', '1', '0', '1', '1', '0', '1', '1', '0', '1', '0', '0', '1', '1', '0', '1', '0', '1', '1', '0', '1', '1', '0', '1', '0', '1', '0', '1', '0', '1', '0', '1', '0', '0', '1', '1', '0', '0', '0', '1', '1', '0', '1', '1', '0', '1', '1', '0', '1', '1', '0', '0', '1', '1', '0', '1', '1', '0', '1', '0', '0', '1', '1', '0', '1', '1', '0', '0', '0', '0', '1', '1', '0', '0', '1', '0', '0', '0', '1', '1', '0', '1', '1', '0', '0', '0', '1']
>>>
Переделал в генератор:
>>> import random
>>>
>>> def f(el=(), er=(), n=0):
... assert len(el) == len(er)
... rep = [0] * len(el)
... for _ in range(n):
... while True:
... e = random.choice(el)
... i = el.index(e)
... t = rep[i] + 1
... rep = [0] * len(rep)
... rep[i] = t
... if t <= er[i]:
... yield e
... break
...
>>> f('01', (4, 2), 200)
<generator object f at 0xb739eb94>
>>> ''.join(f('01', (4, 2), 200))
'11010010011010110011011010110011011000011000100101011010110001010001101101010110101011010110110011011001001100110110011010010011010101000010100110011011000110011010110110101101101100110100110001011010'
>>>