diff options
Diffstat (limited to 'Lib/random.py')
-rw-r--r-- | Lib/random.py | 21 |
1 files changed, 11 insertions, 10 deletions
diff --git a/Lib/random.py b/Lib/random.py index b4ad2b38ae..943fa51a88 100644 --- a/Lib/random.py +++ b/Lib/random.py @@ -312,17 +312,18 @@ class Random(_random.Random): 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 non-sequence iterables - population = tuple(population) - selected = set() - selected_add = selected.add - for i in xrange(k): - j = _int(random() * n) - while j in selected: + selected = set() + selected_add = selected.add + for i in xrange(k): j = _int(random() * n) - selected_add(j) - result[i] = population[j] + while j in selected: + j = _int(random() * n) + selected_add(j) + result[i] = population[j] + except (TypeError, KeyError): # handle sets and dictionaries + if isinstance(population, list): + raise + return self.sample(list(population), k) return result ## -------------------- real-valued distributions ------------------- |