mirror of
https://github.com/python/cpython.git
synced 2025-09-26 10:19:53 +00:00
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:
parent
c6e63d9d35
commit
68784fed78
5 changed files with 47 additions and 26 deletions
|
@ -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
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue