@@ -151,6 +151,7 @@ def test_sample(self):
151
151
# Exception raised if size of sample exceeds that of population
152
152
self .assertRaises (ValueError , self .gen .sample , population , N + 1 )
153
153
self .assertRaises (ValueError , self .gen .sample , [], - 1 )
154
+ self .assertRaises (TypeError , self .gen .sample , population , 1.0 )
154
155
155
156
def test_sample_distribution (self ):
156
157
# For the entire allowable range of 0 <= k <= N, validate that
@@ -378,122 +379,40 @@ def test_gauss(self):
378
379
self .assertEqual (x1 , x2 )
379
380
self .assertEqual (y1 , y2 )
380
381
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
+
381
390
def test_getrandbits (self ):
391
+ getrandbits = self .gen .getrandbits
382
392
# Verify ranges
383
393
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 )
386
396
387
397
# Verify all bits active
388
- getbits = self .gen .getrandbits
389
398
for span in [1 , 2 , 3 , 4 , 31 , 32 , 32 , 52 , 53 , 54 , 119 , 127 , 128 , 129 ]:
390
399
all_bits = 2 ** span - 1
391
400
cum = 0
392
401
cpl_cum = 0
393
402
for i in range (100 ):
394
- v = getbits (span )
403
+ v = getrandbits (span )
395
404
cum |= v
396
405
cpl_cum |= all_bits ^ v
397
406
self .assertEqual (cum , all_bits )
398
407
self .assertEqual (cpl_cum , all_bits )
399
408
400
409
# 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 )
497
416
498
417
def test_bigrand (self ):
499
418
# The randrange routine should build-up the required number of bits
@@ -572,6 +491,10 @@ def test_randrange_step(self):
572
491
randrange (1000 , step = 100 )
573
492
with self .assertRaises (TypeError ):
574
493
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 ))
575
498
576
499
def test_randbelow_logic (self , _log = log , int = int ):
577
500
# check bitcount transition points: 2**i and 2**(i+1)-1
@@ -594,6 +517,116 @@ def test_randbelow_logic(self, _log=log, int=int):
594
517
self .assertEqual (k , numbits ) # note the stronger assertion
595
518
self .assertTrue (2 ** k > n > 2 ** (k - 1 )) # note the stronger assertion
596
519
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
+
597
630
598
631
class TestRawMersenneTwister (unittest .TestCase ):
599
632
@test .support .cpython_only
@@ -779,38 +812,6 @@ def test_long_seed(self):
779
812
seed = (1 << (10000 * 8 )) - 1 # about 10K bytes
780
813
self .gen .seed (seed )
781
814
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
-
814
815
def test_getrandbits (self ):
815
816
super ().test_getrandbits ()
816
817
@@ -848,27 +849,6 @@ def test_randrange_uses_getrandbits(self):
848
849
self .assertEqual (self .gen .randrange (2 ** 99 ),
849
850
97904845777343510404718956115 )
850
851
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
-
872
852
def test_randbelow_without_getrandbits (self ):
873
853
# Random._randbelow() can only use random() when the built-in one
874
854
# has been overridden but no new getrandbits() method was supplied.
@@ -903,14 +883,6 @@ def test_randbelow_without_getrandbits(self):
903
883
self .gen ._randbelow_without_getrandbits (n , maxsize = maxsize )
904
884
self .assertEqual (random_mock .call_count , 2 )
905
885
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
-
914
886
def test_choices_algorithms (self ):
915
887
# The various ways of specifying weights should produce the same results
916
888
choices = self .gen .choices
0 commit comments