. , numpy.random.geometric:
import itertools
import numpy
def binomial_choice(L, p):
iterator = iter(L)
while True:
to_skip = numpy.random.geometric(p) - 1
yield next(itertools.islice(iterator, to_skip, None))
, .
Python 3.5+ - PEP 479:
def binomial_choice(L, p):
iterator = iter(L)
try:
while True:
to_skip = numpy.random.geometric(p) - 1
yield next(itertools.islice(iterator, to_skip, None))
except StopIteration:
return
:
In [1]: list(binomial_choice(range(100), 0.05))
Out[1]: [9, 15, 31, 53, 92, 93]
In [2]: list(binomial_choice(range(5), 1))
Out[2]: [0, 1, 2, 3, 4]
:
In [5]: sum(len(list(binomial_choice(range(100), 0.05))) for i in range(100000)) / 100000
Out[5]: 4.99883
, :
In [14]: timeit list(binomial_choice_geometric(range(1000), 0.01))
10000 loops, best of 3: 24.4 µs per loop
In [11]: timeit list(binomial_choice_geometric_3_5(range(1000), 0.01))
10000 loops, best of 3: 42.7 µs per loop
In [12]: timeit list(binomial_choice_jump_calculation(range(1000), 0.01))
1000 loops, best of 3: 596 µs per loop
In [13]: timeit list(binomial_choice_foreach_random(range(1000), 0.01))
1000 loops, best of 3: 203 µs per loop
random.sample ( numpy.random.binomial ), len :
In [19]: timeit list(binomial_choice_random_sample(range(1000), 0.01))
10000 loops, best of 3: 19.8 µs per loop