On 2/5/2012 11:01 PM, Steven D'Aprano wrote:
Reading the docs, I would expect that when using an int as seed, you
should get identical results.
That is similar to expecting hash to be consistent from version to version.
There is no mention that the PRNG has changed between 2.6 and 3.2;
There is at best an informal policy. This was discussed in
http://bugs.python.org/issue9025
Antoine argued that if there were a written policy, it should be limited
to bug-fix releases within a version. I agree.
It appears to be a bug in 3.2, because 3.1 gives the same results as 2.6:
This change is a side effect of fixing the bug of non-uniformity
discussed in that issue. In any case, in 2.7 and probably 3.1:
def choice(self, seq):
"""Choose a random element from a non-empty sequence."""
return seq[int(self.random() * len(seq))] # raises IndexError
whereas in 3.2:
def choice(self, seq):
"""Choose a random element from a non-empty sequence."""
try:
i = self._randbelow(len(seq))
except ValueError:
raise IndexError('Cannot choose from an empty sequence')
return seq[i]
The change was announced in What's New in 3.2
random
The integer methods in the random module now do a better job of
producing uniform distributions. Previously, they computed selections
with int(n*random()) which had a slight bias whenever n was not a power
of two. Now, multiple selections are made from a range up to the next
power of two and a selection is kept only when it falls within the range
0 <= x < n. The functions and methods affected are randrange(),
randint(), choice(), shuffle() and sample().
--
Terry Jan Reedy
--
http://mail.python.org/mailman/listinfo/python-list