Author wolma
Recipients rhettinger, serhiy.storchaka, wolma
Date 2018-04-01.20:04:10
SpamBayes Score -1.0
Marked as misclassified Yes
Message-id <>

Return a random element from the non-empty sequence seq. If seq is empty, raises IndexError.

>>> import random
>>> random.choice([])
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/home/wolma/cpython/", line 259, in choice
    raise IndexError('Cannot choose from an empty sequence') from None
IndexError: Cannot choose from an empty sequence

but when not using getrandbits internally:
>>> class MyRandom(random.Random):
...     def random(self):
...         return super().random()
>>> my_random=MyRandom()
>>> my_random.choice([])
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/home/wolma/cpython/", line 257, in choice
    i = self._randbelow(len(seq))
  File "/home/wolma/cpython/", line 245, in _randbelow
    rem = maxsize % n
ZeroDivisionError: integer division or modulo by zero

This is because the ValueError that random.choice tries to catch gets raised only in the getrandbits-dependent branch of Random._randbelow, but not in the branch using only Random.random (even though Random._randbelow suggests uniform behaviour.
Date User Action Args
2018-04-01 20:04:10wolmasetrecipients: + wolma, rhettinger, serhiy.storchaka
2018-04-01 20:04:10wolmasetmessageid: <>
2018-04-01 20:04:10wolmalinkissue33203 messages
2018-04-01 20:04:10wolmacreate