@@ -151,6 +151,7 @@ def test_sample(self):
151151 # Exception raised if size of sample exceeds that of population
152152 self .assertRaises (ValueError , self .gen .sample , population , N + 1 )
153153 self .assertRaises (ValueError , self .gen .sample , [], - 1 )
154+ self .assertRaises (TypeError , self .gen .sample , population , 1.0 )
154155
155156 def test_sample_distribution (self ):
156157 # For the entire allowable range of 0 <= k <= N, validate that
@@ -378,122 +379,40 @@ def test_gauss(self):
378379 self .assertEqual (x1 , x2 )
379380 self .assertEqual (y1 , y2 )
380381
382+ def test_53_bits_per_float (self ):
383+ # This should pass whenever a C double has 53 bit precision.
384+ span = 2 ** 53
385+ cum = 0
386+ for i in range (100 ):
387+ cum |= int (self .gen .random () * span )
388+ self .assertEqual (cum , span - 1 )
389+
381390 def test_getrandbits (self ):
391+ getrandbits = self .gen .getrandbits
382392 # Verify ranges
383393 for k in range (1 , 1000 ):
384- self .assertTrue (0 <= self . gen . getrandbits (k ) < 2 ** k )
385- self .assertEqual (self . gen . getrandbits (0 ), 0 )
394+ self .assertTrue (0 <= getrandbits (k ) < 2 ** k )
395+ self .assertEqual (getrandbits (0 ), 0 )
386396
387397 # Verify all bits active
388- getbits = self .gen .getrandbits
389398 for span in [1 , 2 , 3 , 4 , 31 , 32 , 32 , 52 , 53 , 54 , 119 , 127 , 128 , 129 ]:
390399 all_bits = 2 ** span - 1
391400 cum = 0
392401 cpl_cum = 0
393402 for i in range (100 ):
394- v = getbits (span )
403+ v = getrandbits (span )
395404 cum |= v
396405 cpl_cum |= all_bits ^ v
397406 self .assertEqual (cum , all_bits )
398407 self .assertEqual (cpl_cum , all_bits )
399408
400409 # Verify argument checking
401- self .assertRaises (TypeError , self .gen .getrandbits )
402- self .assertRaises (TypeError , self .gen .getrandbits , 1 , 2 )
403- self .assertRaises (ValueError , self .gen .getrandbits , - 1 )
404- self .assertRaises (OverflowError , self .gen .getrandbits , 1 << 1000 )
405- self .assertRaises (ValueError , self .gen .getrandbits , - 1 << 1000 )
406- self .assertRaises (TypeError , self .gen .getrandbits , 10.1 )
407-
408- def test_pickling (self ):
409- for proto in range (pickle .HIGHEST_PROTOCOL + 1 ):
410- state = pickle .dumps (self .gen , proto )
411- origseq = [self .gen .random () for i in range (10 )]
412- newgen = pickle .loads (state )
413- restoredseq = [newgen .random () for i in range (10 )]
414- self .assertEqual (origseq , restoredseq )
415-
416- def test_bug_1727780 (self ):
417- # verify that version-2-pickles can be loaded
418- # fine, whether they are created on 32-bit or 64-bit
419- # platforms, and that version-3-pickles load fine.
420- files = [("randv2_32.pck" , 780 ),
421- ("randv2_64.pck" , 866 ),
422- ("randv3.pck" , 343 )]
423- for file , value in files :
424- with open (support .findfile (file ),"rb" ) as f :
425- r = pickle .load (f )
426- self .assertEqual (int (r .random ()* 1000 ), value )
427-
428- def test_bug_9025 (self ):
429- # Had problem with an uneven distribution in int(n*random())
430- # Verify the fix by checking that distributions fall within expectations.
431- n = 100000
432- randrange = self .gen .randrange
433- k = sum (randrange (6755399441055744 ) % 3 == 2 for i in range (n ))
434- self .assertTrue (0.30 < k / n < .37 , (k / n ))
435-
436- def test_randbytes (self ):
437- # Verify ranges
438- for n in range (1 , 10 ):
439- data = self .gen .randbytes (n )
440- self .assertEqual (type (data ), bytes )
441- self .assertEqual (len (data ), n )
442-
443- self .assertEqual (self .gen .randbytes (0 ), b'' )
444-
445- # Verify argument checking
446- self .assertRaises (TypeError , self .gen .randbytes )
447- self .assertRaises (TypeError , self .gen .randbytes , 1 , 2 )
448- self .assertRaises (ValueError , self .gen .randbytes , - 1 )
449- self .assertRaises (OverflowError , self .gen .randbytes , 1 << 1000 )
450- self .assertRaises ((ValueError , OverflowError ), self .gen .randbytes , - 1 << 1000 )
451- self .assertRaises (TypeError , self .gen .randbytes , 1.0 )
452-
453- def test_mu_sigma_default_args (self ):
454- self .assertIsInstance (self .gen .normalvariate (), float )
455- self .assertIsInstance (self .gen .gauss (), float )
456-
457-
458- try :
459- random .SystemRandom ().random ()
460- except NotImplementedError :
461- SystemRandom_available = False
462- else :
463- SystemRandom_available = True
464-
465- @unittest .skipUnless (SystemRandom_available , "random.SystemRandom not available" )
466- class SystemRandom_TestBasicOps (TestBasicOps , unittest .TestCase ):
467- gen = random .SystemRandom ()
468-
469- def test_autoseed (self ):
470- # Doesn't need to do anything except not fail
471- self .gen .seed ()
472-
473- def test_saverestore (self ):
474- self .assertRaises (NotImplementedError , self .gen .getstate )
475- self .assertRaises (NotImplementedError , self .gen .setstate , None )
476-
477- def test_seedargs (self ):
478- # Doesn't need to do anything except not fail
479- self .gen .seed (100 )
480-
481- def test_gauss (self ):
482- self .gen .gauss_next = None
483- self .gen .seed (100 )
484- self .assertEqual (self .gen .gauss_next , None )
485-
486- def test_pickling (self ):
487- for proto in range (pickle .HIGHEST_PROTOCOL + 1 ):
488- self .assertRaises (NotImplementedError , pickle .dumps , self .gen , proto )
489-
490- def test_53_bits_per_float (self ):
491- # This should pass whenever a C double has 53 bit precision.
492- span = 2 ** 53
493- cum = 0
494- for i in range (100 ):
495- cum |= int (self .gen .random () * span )
496- self .assertEqual (cum , span - 1 )
410+ self .assertRaises (TypeError , getrandbits )
411+ self .assertRaises (TypeError , getrandbits , 1 , 2 )
412+ self .assertRaises (ValueError , getrandbits , - 1 )
413+ self .assertRaises (OverflowError , getrandbits , 1 << 1000 )
414+ self .assertRaises (ValueError , getrandbits , - 1 << 1000 )
415+ self .assertRaises (TypeError , getrandbits , 10.1 )
497416
498417 def test_bigrand (self ):
499418 # The randrange routine should build-up the required number of bits
@@ -572,6 +491,10 @@ def test_randrange_step(self):
572491 randrange (1000 , step = 100 )
573492 with self .assertRaises (TypeError ):
574493 randrange (1000 , None , step = 100 )
494+ with self .assertRaises (TypeError ):
495+ randrange (1000 , step = MyIndex (1 ))
496+ with self .assertRaises (TypeError ):
497+ randrange (1000 , None , step = MyIndex (1 ))
575498
576499 def test_randbelow_logic (self , _log = log , int = int ):
577500 # check bitcount transition points: 2**i and 2**(i+1)-1
@@ -594,6 +517,116 @@ def test_randbelow_logic(self, _log=log, int=int):
594517 self .assertEqual (k , numbits ) # note the stronger assertion
595518 self .assertTrue (2 ** k > n > 2 ** (k - 1 )) # note the stronger assertion
596519
520+ def test_randrange_index (self ):
521+ randrange = self .gen .randrange
522+ self .assertIn (randrange (MyIndex (5 )), range (5 ))
523+ self .assertIn (randrange (MyIndex (2 ), MyIndex (7 )), range (2 , 7 ))
524+ self .assertIn (randrange (MyIndex (5 ), MyIndex (15 ), MyIndex (2 )), range (5 , 15 , 2 ))
525+
526+ def test_randint (self ):
527+ randint = self .gen .randint
528+ self .assertIn (randint (2 , 5 ), (2 , 3 , 4 , 5 ))
529+ self .assertEqual (randint (2 , 2 ), 2 )
530+ self .assertIn (randint (MyIndex (2 ), MyIndex (5 )), (2 , 3 , 4 , 5 ))
531+ self .assertEqual (randint (MyIndex (2 ), MyIndex (2 )), 2 )
532+
533+ self .assertRaises (ValueError , randint , 5 , 2 )
534+ self .assertRaises (TypeError , randint )
535+ self .assertRaises (TypeError , randint , 2 )
536+ self .assertRaises (TypeError , randint , 2 , 5 , 1 )
537+ self .assertRaises (TypeError , randint , 2.0 , 5 )
538+ self .assertRaises (TypeError , randint , 2 , 5.0 )
539+
540+ def test_pickling (self ):
541+ for proto in range (pickle .HIGHEST_PROTOCOL + 1 ):
542+ state = pickle .dumps (self .gen , proto )
543+ origseq = [self .gen .random () for i in range (10 )]
544+ newgen = pickle .loads (state )
545+ restoredseq = [newgen .random () for i in range (10 )]
546+ self .assertEqual (origseq , restoredseq )
547+
548+ def test_bug_1727780 (self ):
549+ # verify that version-2-pickles can be loaded
550+ # fine, whether they are created on 32-bit or 64-bit
551+ # platforms, and that version-3-pickles load fine.
552+ files = [("randv2_32.pck" , 780 ),
553+ ("randv2_64.pck" , 866 ),
554+ ("randv3.pck" , 343 )]
555+ for file , value in files :
556+ with open (support .findfile (file ),"rb" ) as f :
557+ r = pickle .load (f )
558+ self .assertEqual (int (r .random ()* 1000 ), value )
559+
560+ def test_bug_9025 (self ):
561+ # Had problem with an uneven distribution in int(n*random())
562+ # Verify the fix by checking that distributions fall within expectations.
563+ n = 100000
564+ randrange = self .gen .randrange
565+ k = sum (randrange (6755399441055744 ) % 3 == 2 for i in range (n ))
566+ self .assertTrue (0.30 < k / n < .37 , (k / n ))
567+
568+ def test_randrange_bug_1590891 (self ):
569+ start = 1000000000000
570+ stop = - 100000000000000000000
571+ step = - 200
572+ x = self .gen .randrange (start , stop , step )
573+ self .assertTrue (stop < x <= start )
574+ self .assertEqual ((x + stop )% step , 0 )
575+
576+ def test_randbytes (self ):
577+ # Verify ranges
578+ for n in range (1 , 10 ):
579+ data = self .gen .randbytes (n )
580+ self .assertEqual (type (data ), bytes )
581+ self .assertEqual (len (data ), n )
582+
583+ self .assertEqual (self .gen .randbytes (0 ), b'' )
584+
585+ # Verify argument checking
586+ self .assertRaises (TypeError , self .gen .randbytes )
587+ self .assertRaises (TypeError , self .gen .randbytes , 1 , 2 )
588+ self .assertRaises (ValueError , self .gen .randbytes , - 1 )
589+ self .assertRaises (OverflowError , self .gen .randbytes , 1 << 1000 )
590+ self .assertRaises ((ValueError , OverflowError ), self .gen .randbytes , - 1 << 1000 )
591+ self .assertRaises (TypeError , self .gen .randbytes , 1.0 )
592+
593+ def test_mu_sigma_default_args (self ):
594+ self .assertIsInstance (self .gen .normalvariate (), float )
595+ self .assertIsInstance (self .gen .gauss (), float )
596+
597+
598+ try :
599+ random .SystemRandom ().random ()
600+ except NotImplementedError :
601+ SystemRandom_available = False
602+ else :
603+ SystemRandom_available = True
604+
605+ @unittest .skipUnless (SystemRandom_available , "random.SystemRandom not available" )
606+ class SystemRandom_TestBasicOps (TestBasicOps , unittest .TestCase ):
607+ gen = random .SystemRandom ()
608+
609+ def test_autoseed (self ):
610+ # Doesn't need to do anything except not fail
611+ self .gen .seed ()
612+
613+ def test_saverestore (self ):
614+ self .assertRaises (NotImplementedError , self .gen .getstate )
615+ self .assertRaises (NotImplementedError , self .gen .setstate , None )
616+
617+ def test_seedargs (self ):
618+ # Doesn't need to do anything except not fail
619+ self .gen .seed (100 )
620+
621+ def test_gauss (self ):
622+ self .gen .gauss_next = None
623+ self .gen .seed (100 )
624+ self .assertEqual (self .gen .gauss_next , None )
625+
626+ def test_pickling (self ):
627+ for proto in range (pickle .HIGHEST_PROTOCOL + 1 ):
628+ self .assertRaises (NotImplementedError , pickle .dumps , self .gen , proto )
629+
597630
598631class TestRawMersenneTwister (unittest .TestCase ):
599632 @test .support .cpython_only
@@ -779,38 +812,6 @@ def test_long_seed(self):
779812 seed = (1 << (10000 * 8 )) - 1 # about 10K bytes
780813 self .gen .seed (seed )
781814
782- def test_53_bits_per_float (self ):
783- # This should pass whenever a C double has 53 bit precision.
784- span = 2 ** 53
785- cum = 0
786- for i in range (100 ):
787- cum |= int (self .gen .random () * span )
788- self .assertEqual (cum , span - 1 )
789-
790- def test_bigrand (self ):
791- # The randrange routine should build-up the required number of bits
792- # in stages so that all bit positions are active.
793- span = 2 ** 500
794- cum = 0
795- for i in range (100 ):
796- r = self .gen .randrange (span )
797- self .assertTrue (0 <= r < span )
798- cum |= r
799- self .assertEqual (cum , span - 1 )
800-
801- def test_bigrand_ranges (self ):
802- for i in [40 ,80 , 160 , 200 , 211 , 250 , 375 , 512 , 550 ]:
803- start = self .gen .randrange (2 ** (i - 2 ))
804- stop = self .gen .randrange (2 ** i )
805- if stop <= start :
806- continue
807- self .assertTrue (start <= self .gen .randrange (start , stop ) < stop )
808-
809- def test_rangelimits (self ):
810- for start , stop in [(- 2 ,0 ), (- (2 ** 60 )- 2 ,- (2 ** 60 )), (2 ** 60 ,2 ** 60 + 2 )]:
811- self .assertEqual (set (range (start ,stop )),
812- set ([self .gen .randrange (start ,stop ) for i in range (100 )]))
813-
814815 def test_getrandbits (self ):
815816 super ().test_getrandbits ()
816817
@@ -848,27 +849,6 @@ def test_randrange_uses_getrandbits(self):
848849 self .assertEqual (self .gen .randrange (2 ** 99 ),
849850 97904845777343510404718956115 )
850851
851- def test_randbelow_logic (self , _log = log , int = int ):
852- # check bitcount transition points: 2**i and 2**(i+1)-1
853- # show that: k = int(1.001 + _log(n, 2))
854- # is equal to or one greater than the number of bits in n
855- for i in range (1 , 1000 ):
856- n = 1 << i # check an exact power of two
857- numbits = i + 1
858- k = int (1.00001 + _log (n , 2 ))
859- self .assertEqual (k , numbits )
860- self .assertEqual (n , 2 ** (k - 1 ))
861-
862- n += n - 1 # check 1 below the next power of two
863- k = int (1.00001 + _log (n , 2 ))
864- self .assertIn (k , [numbits , numbits + 1 ])
865- self .assertTrue (2 ** k > n > 2 ** (k - 2 ))
866-
867- n -= n >> 15 # check a little farther below the next power of two
868- k = int (1.00001 + _log (n , 2 ))
869- self .assertEqual (k , numbits ) # note the stronger assertion
870- self .assertTrue (2 ** k > n > 2 ** (k - 1 )) # note the stronger assertion
871-
872852 def test_randbelow_without_getrandbits (self ):
873853 # Random._randbelow() can only use random() when the built-in one
874854 # has been overridden but no new getrandbits() method was supplied.
@@ -903,14 +883,6 @@ def test_randbelow_without_getrandbits(self):
903883 self .gen ._randbelow_without_getrandbits (n , maxsize = maxsize )
904884 self .assertEqual (random_mock .call_count , 2 )
905885
906- def test_randrange_bug_1590891 (self ):
907- start = 1000000000000
908- stop = - 100000000000000000000
909- step = - 200
910- x = self .gen .randrange (start , stop , step )
911- self .assertTrue (stop < x <= start )
912- self .assertEqual ((x + stop )% step , 0 )
913-
914886 def test_choices_algorithms (self ):
915887 # The various ways of specifying weights should produce the same results
916888 choices = self .gen .choices
0 commit comments