mirror of
https://github.com/python/cpython.git
synced 2025-10-03 13:45:29 +00:00
Move random selection recipes from itertools.rst to random.rst (GH-98369)
(cherry picked from commit 70732d8a4c
)
Co-authored-by: Raymond Hettinger <rhettinger@users.noreply.github.com>
This commit is contained in:
parent
6c7f7ec819
commit
9cb30bb339
2 changed files with 31 additions and 25 deletions
|
@ -1000,31 +1000,6 @@ which incur interpreter overhead.
|
|||
# first_true([a,b], x, f) --> a if f(a) else b if f(b) else x
|
||||
return next(filter(pred, iterable), default)
|
||||
|
||||
def random_product(*args, repeat=1):
|
||||
"Random selection from itertools.product(*args, **kwds)"
|
||||
pools = [tuple(pool) for pool in args] * repeat
|
||||
return tuple(map(random.choice, pools))
|
||||
|
||||
def random_permutation(iterable, r=None):
|
||||
"Random selection from itertools.permutations(iterable, r)"
|
||||
pool = tuple(iterable)
|
||||
r = len(pool) if r is None else r
|
||||
return tuple(random.sample(pool, r))
|
||||
|
||||
def random_combination(iterable, r):
|
||||
"Random selection from itertools.combinations(iterable, r)"
|
||||
pool = tuple(iterable)
|
||||
n = len(pool)
|
||||
indices = sorted(random.sample(range(n), r))
|
||||
return tuple(pool[i] for i in indices)
|
||||
|
||||
def random_combination_with_replacement(iterable, r):
|
||||
"Random selection from itertools.combinations_with_replacement(iterable, r)"
|
||||
pool = tuple(iterable)
|
||||
n = len(pool)
|
||||
indices = sorted(random.choices(range(n), k=r))
|
||||
return tuple(pool[i] for i in indices)
|
||||
|
||||
def nth_combination(iterable, r, index):
|
||||
"Equivalent to list(combinations(iterable, r))[index]"
|
||||
pool = tuple(iterable)
|
||||
|
|
|
@ -564,6 +564,37 @@ Simulation of arrival times and service deliveries for a multiserver queue::
|
|||
Recipes
|
||||
-------
|
||||
|
||||
These recipes show how to efficiently make random selections
|
||||
from the combinatoric iterators in the :mod:`itertools` module:
|
||||
|
||||
.. testcode::
|
||||
import random
|
||||
|
||||
def random_product(*args, repeat=1):
|
||||
"Random selection from itertools.product(*args, **kwds)"
|
||||
pools = [tuple(pool) for pool in args] * repeat
|
||||
return tuple(map(random.choice, pools))
|
||||
|
||||
def random_permutation(iterable, r=None):
|
||||
"Random selection from itertools.permutations(iterable, r)"
|
||||
pool = tuple(iterable)
|
||||
r = len(pool) if r is None else r
|
||||
return tuple(random.sample(pool, r))
|
||||
|
||||
def random_combination(iterable, r):
|
||||
"Random selection from itertools.combinations(iterable, r)"
|
||||
pool = tuple(iterable)
|
||||
n = len(pool)
|
||||
indices = sorted(random.sample(range(n), r))
|
||||
return tuple(pool[i] for i in indices)
|
||||
|
||||
def random_combination_with_replacement(iterable, r):
|
||||
"Random selection from itertools.combinations_with_replacement(iterable, r)"
|
||||
pool = tuple(iterable)
|
||||
n = len(pool)
|
||||
indices = sorted(random.choices(range(n), k=r))
|
||||
return tuple(pool[i] for i in indices)
|
||||
|
||||
The default :func:`.random` returns multiples of 2⁻⁵³ in the range
|
||||
*0.0 ≤ x < 1.0*. All such numbers are evenly spaced and are exactly
|
||||
representable as Python floats. However, many other representable
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue