aboutsummaryrefslogtreecommitdiffstatshomepage
path: root/Lib/random.py
diff options
context:
space:
mode:
authorRaymond Hettinger <python@rcn.com>2003-09-06 04:25:54 +0000
committerRaymond Hettinger <python@rcn.com>2003-09-06 04:25:54 +0000
commit66d09f1b3029d9cf975ccf26c437c9fb2605db91 (patch)
treeb8c031f72f6109de1be68664fc391c9a334a3f28 /Lib/random.py
parentc8b08b446a95694cf246c3fd92c1bc656944d68f (diff)
downloadcpython-66d09f1b3029d9cf975ccf26c437c9fb2605db91.tar.gz
cpython-66d09f1b3029d9cf975ccf26c437c9fb2605db91.zip
SF bug #801342: Bug (documentation or real, your choice) in random.sample.
random.sample() uses one of two algorithms depending on the ratio of the sample size to the population size. One of the algorithms accepted any iterable population argument so long as it defined __len__(). The other had a stronger requirement that the population argument be indexable. While it met the documentation specifications which insisted that the population argument be a sequence, it made random.sample() less usable with sets. So, the second algorithm was modified to coerce non-indexable iterables and dictionaries into a tuple before proceeding.
Diffstat (limited to 'Lib/random.py')
-rw-r--r--Lib/random.py4
1 files changed, 4 insertions, 0 deletions
diff --git a/Lib/random.py b/Lib/random.py
index 7210f62b100..2530c39ac76 100644
--- a/Lib/random.py
+++ b/Lib/random.py
@@ -258,6 +258,10 @@ class Random(_random.Random):
result[i] = pool[j]
pool[j] = pool[n-i-1] # move non-selected item into vacancy
else:
+ try:
+ n > 0 and (population[0], population[n//2], population[n-1])
+ except (TypeError, KeyError): # handle sets and dictionaries
+ population = tuple(population)
selected = {}
for i in xrange(k):
j = _int(random() * n)