FazBrowse GitHub Viewer | Trending |
URL:
| Home
Tools: [Download Repo ZIP]   [Original HTTPS Page]

bpo-40282: Allow random.getrandbits(0) by pitrou · Pull Request #19539 · python/cpython · GitHub

Repository navigation

bpo-40282: Allow random.getrandbits(0) - #19539

Merged
pitrou merged 7 commits into
python:masterfrom
pitrou:bpo40282-getrandbits0
Apr 17, 2020
Merged

pitrou merged 7 commits into
python:masterfrom
pitrou:bpo40282-getrandbits0

Conversation

pitrou commented Apr 15, 2020 •
edited by bedevere-bot
Loading

Copy link
Copy Markdown
Member

Comment thread Lib/test/test_random.py Outdated

Copy link
Copy Markdown
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Choose a reason Spam Abuse Off Topic Outdated Duplicate Resolved Low Quality

Note I've enhanced this test a bit to check that all bits take both values 0 and 1 accross 100 draws.

Comment thread Doc/library/random.rst Outdated
Comment thread Lib/random.py Outdated
Comment thread Lib/random.py Outdated
Comment thread Lib/random.py Outdated
Comment thread Lib/random.py Outdated

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Choose a reason Spam Abuse Off Topic Outdated Duplicate Resolved Low Quality

We can use (n-1) now.

Suggested change
k = n.bit_length() # don't use (n-1) here because n can be 1
k = (n-1).bit_length()

Copy link
Copy Markdown
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Choose a reason Spam Abuse Off Topic Outdated Duplicate Resolved Low Quality

I think we want to ensure that the values produced for a given seed don't change, so we probably can't change this anymore.

Comment thread Lib/random.py Outdated
Comment on lines 264 to 265

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Choose a reason Spam Abuse Off Topic Outdated Duplicate Resolved Low Quality

Maybe use assert?

Copy link
Copy Markdown
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Choose a reason Spam Abuse Off Topic Outdated Duplicate Resolved Low Quality

This is the same error as in the other implementation (the one without getrandbits).

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Choose a reason Spam Abuse Off Topic Outdated Duplicate Resolved Low Quality

Seems this check causes a performance regression.

aeros Apr 15, 2020 •
edited
Loading

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Choose a reason Spam Abuse Off Topic Outdated Duplicate Resolved Low Quality

Is there any situation where a user could specifically encounter the above ValueError from the public methods? If not, I think an assertion would make more sense here; seeing as it's a private member that's only being used from within the random module. IMO, the same applies to _randbelow_without_getrandbits().

Also, how significant is the performance regression @serhiy-storchaka?

Comment thread Modules/_randommodule.c Outdated

Copy link
Copy Markdown
Contributor

This makes shuffle() about 6% slower:

python -m timeit -r11 -s 'from random import shuffle' -s 's=list(range(1000))' 'shuffle(s)'

vstinner left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Choose a reason Spam Abuse Off Topic Outdated Duplicate Resolved Low Quality

random.Random has a surprising API. The base class is Mersenne Twister which implements getrandbits(). Inheritance is non-trivial. Does your change work if a subclass implements _randbelow()? What if it implements random()? See Random.__init_subclass__().

Comment thread Lib/test/test_random.py Outdated
Comment thread Doc/library/random.rst Outdated
Comment thread Doc/library/random.rst Outdated

Copy link
Copy Markdown
Member

_randbelow() is not designed for overriding. If there is a problem with this, it can be made private (__randbelow()).

If the subclass implements random() but not getrandbits(), its methods will use random() instead of getrandbits().

Comment thread Lib/random.py Outdated
pitrou force-pushed the bpo40282-getrandbits0 branch from 9ccb7bc to 3b86eb8 Compare April 17, 2020 16:26

pitrou commented Apr 17, 2020

Copy link
Copy Markdown
Member Author

I rebased and applied two trivial changes from reviewing. Will merge if CI is green. Thanks everyone!

pitrou force-pushed the bpo40282-getrandbits0 branch from 3b86eb8 to c4673f0 Compare April 17, 2020 17:11
pitrou merged commit 75a3378 into python:master Apr 17, 2020
pitrou deleted the bpo40282-getrandbits0 branch April 17, 2020 17:32

vstinner commented Apr 20, 2020 •
edited by bedevere-bot
Loading

Copy link
Copy Markdown
Member

random.Random has a surprising API. The base class is Mersenne Twister which implements getrandbits(). Inheritance is non-trivial. Does your change work if a subclass implements _randbelow()? What if it implements random()? See Random.init_subclass().

I created bpo-40346: "Redesign random.Random class inheritance".

CuriousLearner added a commit to CuriousLearner/cpython that referenced this pull request May 29, 2020
* master: (1985 commits)
  bpo-40179: Fix translation of #elif in Argument Clinic (pythonGH-19364)
  bpo-35967: Skip test with `uname -p` on Android (pythonGH-19577)
  bpo-40257: Improve help for the typing module (pythonGH-19546)
  Fix two typos in multiprocessing (pythonGH-19571)
  bpo-40286: Use random.randbytes() in tests (pythonGH-19575)
  bpo-40286: Makes simpler the relation between randbytes() and getrandbits() (pythonGH-19574)
  bpo-39894: Route calls from pathlib.Path.samefile() to os.stat() via the path accessor (pythonGH-18836)
  bpo-39897: Remove needless `Path(self.parent)` call, which makes `is_mount()` misbehave in `Path` subclasses. (pythonGH-18839)
  bpo-40282: Allow random.getrandbits(0) (pythonGH-19539)
  bpo-40302: UTF-32 encoder SWAB4() macro use a|b rather than a+b (pythonGH-19572)
  bpo-40302: Replace PY_INT64_T with int64_t (pythonGH-19573)
  bpo-40286: Add randbytes() method to random.Random (pythonGH-19527)
  bpo-39901: Move `pathlib.Path.owner()` and `group()` implementations into the path accessor. (pythonGH-18844)
  bpo-40300: Allow empty logging.Formatter.default_msec_format. (pythonGH-19551)
  bpo-40302: Add pycore_byteswap.h header file (pythonGH-19552)
  bpo-40287: Fix SpooledTemporaryFile.seek() return value (pythonGH-19540)
  Minor modernization and readability improvement to the tokenizer example (pythonGH-19558)
  bpo-40294: Fix _asyncio when module is loaded/unloaded multiple times (pythonGH-19542)
  Fix parameter names in assertIn() docs (pythonGH-18829)
  bpo-39793: use the same domain on make_msgid tests (python#18698)
  ...
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters. Learn more about bidirectional Unicode characters
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

8 participants


Back | FazBrowse Home | New Git URL