summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorRaymond Hettinger <rhettinger@users.noreply.github.com>2022-10-17 22:30:49 (GMT)
committerGitHub <noreply@github.com>2022-10-17 22:30:49 (GMT)
commit70732d8a4c98cdf3cc9efa5241ce33fb9bc323ca (patch)
tree692066a619edb0bff511dd3491435ba349da299b
parent5fe043147493e33f2af6ab74610735130add1fe9 (diff)
downloadcpython-70732d8a4c98cdf3cc9efa5241ce33fb9bc323ca.zip
cpython-70732d8a4c98cdf3cc9efa5241ce33fb9bc323ca.tar.gz
cpython-70732d8a4c98cdf3cc9efa5241ce33fb9bc323ca.tar.bz2
Move random selection recipes from itertools.rst to random.rst (GH-98369)
-rw-r--r--Doc/library/itertools.rst25
-rw-r--r--Doc/library/random.rst31
2 files changed, 31 insertions, 25 deletions
diff --git a/Doc/library/itertools.rst b/Doc/library/itertools.rst
index 88e1e5a..9f7ec10 100644
--- a/Doc/library/itertools.rst
+++ b/Doc/library/itertools.rst
@@ -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)
diff --git a/Doc/library/random.rst b/Doc/library/random.rst
index 7e527a9..669204b 100644
--- a/Doc/library/random.rst
+++ b/Doc/library/random.rst
@@ -582,6 +582,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