@@ -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
@@ -268,6 +269,7 @@ def test_choices(self):
268269 choices (data , range (4 ), k = 5 ),
269270 choices (k = 5 , population = data , weights = range (4 )),
270271 choices (k = 5 , population = data , cum_weights = range (4 )),
272+ choices (data , k = MyIndex (5 )),
271273 ]:
272274 self .assertEqual (len (sample ), 5 )
273275 self .assertEqual (type (sample ), list )
@@ -378,122 +380,40 @@ def test_gauss(self):
378380 self .assertEqual (x1 , x2 )
379381 self .assertEqual (y1 , y2 )
380382
383+ @support .requires_IEEE_754
384+ def test_53_bits_per_float (self ):
385+ span = 2 ** 53
386+ cum = 0
387+ for i in range (100 ):
388+ cum |= int (self .gen .random () * span )
389+ self .assertEqual (cum , span - 1 )
390+
381391 def test_getrandbits (self ):
392+ getrandbits = self .gen .getrandbits
382393 # Verify ranges
383394 for k in range (1 , 1000 ):
384- self .assertTrue (0 <= self . gen . getrandbits (k ) < 2 ** k )
385- self .assertEqual (self . gen . getrandbits (0 ), 0 )
395+ self .assertTrue (0 <= getrandbits (k ) < 2 ** k )
396+ self .assertEqual (getrandbits (0 ), 0 )
386397
387398 # Verify all bits active
388- getbits = self .gen .getrandbits
389399 for span in [1 , 2 , 3 , 4 , 31 , 32 , 32 , 52 , 53 , 54 , 119 , 127 , 128 , 129 ]:
390400 all_bits = 2 ** span - 1
391401 cum = 0
392402 cpl_cum = 0
393403 for i in range (100 ):
394- v = getbits (span )
404+ v = getrandbits (span )
395405 cum |= v
396406 cpl_cum |= all_bits ^ v
397407 self .assertEqual (cum , all_bits )
398408 self .assertEqual (cpl_cum , all_bits )
399409
400410 # 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 )
411+ self .assertRaises (TypeError , getrandbits )
412+ self .assertRaises (TypeError , getrandbits , 1 , 2 )
413+ self .assertRaises (ValueError , getrandbits , - 1 )
414+ self .assertRaises (OverflowError , getrandbits , 1 << 1000 )
415+ self .assertRaises (ValueError , getrandbits , - 1 << 1000 )
416+ self .assertRaises (TypeError , getrandbits , 10.1 )
497417
498418 def test_bigrand (self ):
499419 # The randrange routine should build-up the required number of bits
@@ -572,6 +492,10 @@ def test_randrange_step(self):
572492 randrange (1000 , step = 100 )
573493 with self .assertRaises (TypeError ):
574494 randrange (1000 , None , step = 100 )
495+ with self .assertRaises (TypeError ):
496+ randrange (1000 , step = MyIndex (1 ))
497+ with self .assertRaises (TypeError ):
498+ randrange (1000 , None , step = MyIndex (1 ))
575499
576500 def test_randbelow_logic (self , _log = log , int = int ):
577501 # check bitcount transition points: 2**i and 2**(i+1)-1
@@ -594,6 +518,116 @@ def test_randbelow_logic(self, _log=log, int=int):
594518 self .assertEqual (k , numbits ) # note the stronger assertion
595519 self .assertTrue (2 ** k > n > 2 ** (k - 1 )) # note the stronger assertion
596520
521+ def test_randrange_index (self ):
522+ randrange = self .gen .randrange
523+ self .assertIn (randrange (MyIndex (5 )), range (5 ))
524+ self .assertIn (randrange (MyIndex (2 ), MyIndex (7 )), range (2 , 7 ))
525+ self .assertIn (randrange (MyIndex (5 ), MyIndex (15 ), MyIndex (2 )), range (5 , 15 , 2 ))
526+
527+ def test_randint (self ):
528+ randint = self .gen .randint
529+ self .assertIn (randint (2 , 5 ), (2 , 3 , 4 , 5 ))
530+ self .assertEqual (randint (2 , 2 ), 2 )
531+ self .assertIn (randint (MyIndex (2 ), MyIndex (5 )), (2 , 3 , 4 , 5 ))
532+ self .assertEqual (randint (MyIndex (2 ), MyIndex (2 )), 2 )
533+
534+ self .assertRaises (ValueError , randint , 5 , 2 )
535+ self .assertRaises (TypeError , randint )
536+ self .assertRaises (TypeError , randint , 2 )
537+ self .assertRaises (TypeError , randint , 2 , 5 , 1 )
538+ self .assertRaises (TypeError , randint , 2.0 , 5 )
539+ self .assertRaises (TypeError , randint , 2 , 5.0 )
540+
541+ def test_pickling (self ):
542+ for proto in range (pickle .HIGHEST_PROTOCOL + 1 ):
543+ state = pickle .dumps (self .gen , proto )
544+ origseq = [self .gen .random () for i in range (10 )]
545+ newgen = pickle .loads (state )
546+ restoredseq = [newgen .random () for i in range (10 )]
547+ self .assertEqual (origseq , restoredseq )
548+
549+ def test_bug_1727780 (self ):
550+ # verify that version-2-pickles can be loaded
551+ # fine, whether they are created on 32-bit or 64-bit
552+ # platforms, and that version-3-pickles load fine.
553+ files = [("randv2_32.pck" , 780 ),
554+ ("randv2_64.pck" , 866 ),
555+ ("randv3.pck" , 343 )]
556+ for file , value in files :
557+ with open (support .findfile (file ),"rb" ) as f :
558+ r = pickle .load (f )
559+ self .assertEqual (int (r .random ()* 1000 ), value )
560+
561+ def test_bug_9025 (self ):
562+ # Had problem with an uneven distribution in int(n*random())
563+ # Verify the fix by checking that distributions fall within expectations.
564+ n = 100000
565+ randrange = self .gen .randrange
566+ k = sum (randrange (6755399441055744 ) % 3 == 2 for i in range (n ))
567+ self .assertTrue (0.30 < k / n < .37 , (k / n ))
568+
569+ def test_randrange_bug_1590891 (self ):
570+ start = 1000000000000
571+ stop = - 100000000000000000000
572+ step = - 200
573+ x = self .gen .randrange (start , stop , step )
574+ self .assertTrue (stop < x <= start )
575+ self .assertEqual ((x + stop )% step , 0 )
576+
577+ def test_randbytes (self ):
578+ # Verify ranges
579+ for n in range (1 , 10 ):
580+ data = self .gen .randbytes (n )
581+ self .assertEqual (type (data ), bytes )
582+ self .assertEqual (len (data ), n )
583+
584+ self .assertEqual (self .gen .randbytes (0 ), b'' )
585+
586+ # Verify argument checking
587+ self .assertRaises (TypeError , self .gen .randbytes )
588+ self .assertRaises (TypeError , self .gen .randbytes , 1 , 2 )
589+ self .assertRaises (ValueError , self .gen .randbytes , - 1 )
590+ self .assertRaises (OverflowError , self .gen .randbytes , 1 << 1000 )
591+ self .assertRaises ((ValueError , OverflowError ), self .gen .randbytes , - 1 << 1000 )
592+ self .assertRaises (TypeError , self .gen .randbytes , 1.0 )
593+
594+ def test_mu_sigma_default_args (self ):
595+ self .assertIsInstance (self .gen .normalvariate (), float )
596+ self .assertIsInstance (self .gen .gauss (), float )
597+
598+
599+ try :
600+ random .SystemRandom ().random ()
601+ except NotImplementedError :
602+ SystemRandom_available = False
603+ else :
604+ SystemRandom_available = True
605+
606+ @unittest .skipUnless (SystemRandom_available , "random.SystemRandom not available" )
607+ class SystemRandom_TestBasicOps (TestBasicOps , unittest .TestCase ):
608+ gen = random .SystemRandom ()
609+
610+ def test_autoseed (self ):
611+ # Doesn't need to do anything except not fail
612+ self .gen .seed ()
613+
614+ def test_saverestore (self ):
615+ self .assertRaises (NotImplementedError , self .gen .getstate )
616+ self .assertRaises (NotImplementedError , self .gen .setstate , None )
617+
618+ def test_seedargs (self ):
619+ # Doesn't need to do anything except not fail
620+ self .gen .seed (100 )
621+
622+ def test_gauss (self ):
623+ self .gen .gauss_next = None
624+ self .gen .seed (100 )
625+ self .assertEqual (self .gen .gauss_next , None )
626+
627+ def test_pickling (self ):
628+ for proto in range (pickle .HIGHEST_PROTOCOL + 1 ):
629+ self .assertRaises (NotImplementedError , pickle .dumps , self .gen , proto )
630+
597631
598632class TestRawMersenneTwister (unittest .TestCase ):
599633 @test .support .cpython_only
@@ -779,38 +813,6 @@ def test_long_seed(self):
779813 seed = (1 << (10000 * 8 )) - 1 # about 10K bytes
780814 self .gen .seed (seed )
781815
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-
814816 def test_getrandbits (self ):
815817 super ().test_getrandbits ()
816818
@@ -848,27 +850,6 @@ def test_randrange_uses_getrandbits(self):
848850 self .assertEqual (self .gen .randrange (2 ** 99 ),
849851 97904845777343510404718956115 )
850852
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-
872853 def test_randbelow_without_getrandbits (self ):
873854 # Random._randbelow() can only use random() when the built-in one
874855 # has been overridden but no new getrandbits() method was supplied.
@@ -903,14 +884,6 @@ def test_randbelow_without_getrandbits(self):
903884 self .gen ._randbelow_without_getrandbits (n , maxsize = maxsize )
904885 self .assertEqual (random_mock .call_count , 2 )
905886
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-
914887 def test_choices_algorithms (self ):
915888 # The various ways of specifying weights should produce the same results
916889 choices = self .gen .choices
0 commit comments