gh-133489: Remove size restrictions on getrandbits() and randbytes() (GH-133658)

random.getrandbits() can now generate more that 2**31 bits.
random.randbytes() can now generate more that 256 MiB.
This commit is contained in:
Serhiy Storchaka 2025-05-31 11:23:01 +03:00 committed by GitHub
parent c6e63d9d35
commit 68784fed78
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
5 changed files with 47 additions and 26 deletions

View file

@ -392,6 +392,8 @@ class TestBasicOps:
self.assertRaises(TypeError, self.gen.getrandbits)
self.assertRaises(TypeError, self.gen.getrandbits, 1, 2)
self.assertRaises(ValueError, self.gen.getrandbits, -1)
self.assertRaises(OverflowError, self.gen.getrandbits, 1<<1000)
self.assertRaises(ValueError, self.gen.getrandbits, -1<<1000)
self.assertRaises(TypeError, self.gen.getrandbits, 10.1)
def test_pickling(self):
@ -435,6 +437,8 @@ class TestBasicOps:
self.assertRaises(TypeError, self.gen.randbytes)
self.assertRaises(TypeError, self.gen.randbytes, 1, 2)
self.assertRaises(ValueError, self.gen.randbytes, -1)
self.assertRaises(OverflowError, self.gen.randbytes, 1<<1000)
self.assertRaises((ValueError, OverflowError), self.gen.randbytes, -1<<1000)
self.assertRaises(TypeError, self.gen.randbytes, 1.0)
def test_mu_sigma_default_args(self):
@ -806,6 +810,22 @@ class MersenneTwister_TestBasicOps(TestBasicOps, unittest.TestCase):
self.assertEqual(self.gen.getrandbits(100),
97904845777343510404718956115)
def test_getrandbits_2G_bits(self):
size = 2**31
self.gen.seed(1234567)
x = self.gen.getrandbits(size)
self.assertEqual(x.bit_length(), size)
self.assertEqual(x & (2**100-1), 890186470919986886340158459475)
self.assertEqual(x >> (size-100), 1226514312032729439655761284440)
@support.bigmemtest(size=2**32, memuse=1/8+2/15, dry_run=False)
def test_getrandbits_4G_bits(self, size):
self.gen.seed(1234568)
x = self.gen.getrandbits(size)
self.assertEqual(x.bit_length(), size)
self.assertEqual(x & (2**100-1), 287241425661104632871036099814)
self.assertEqual(x >> (size-100), 739728759900339699429794460738)
def test_randrange_uses_getrandbits(self):
# Verify use of getrandbits by randrange
# Use same seed as in the cross-platform repeatability test
@ -962,6 +982,14 @@ class MersenneTwister_TestBasicOps(TestBasicOps, unittest.TestCase):
self.assertEqual(self.gen.randbytes(n),
gen2.getrandbits(n * 8).to_bytes(n, 'little'))
@support.bigmemtest(size=2**29, memuse=1+16/15, dry_run=False)
def test_randbytes_256M(self, size):
self.gen.seed(2849427419)
x = self.gen.randbytes(size)
self.assertEqual(len(x), size)
self.assertEqual(x[:12].hex(), 'f6fd9ae63855ab91ea238b4f')
self.assertEqual(x[-12:].hex(), '0e7af69a84ee99bf4a11becc')
def test_sample_counts_equivalence(self):
# Test the documented strong equivalence to a sample with repeated elements.
# We run this test on random.Random() which makes deterministic selections