@@ -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
@@ -268,6 +269,7 @@ def test_choices(self):
268
269
choices (data , range (4 ), k = 5 ),
269
270
choices (k = 5 , population = data , weights = range (4 )),
270
271
choices (k = 5 , population = data , cum_weights = range (4 )),
272
+ choices (data , k = MyIndex (5 )),
271
273
]:
272
274
self .assertEqual (len (sample ), 5 )
273
275
self .assertEqual (type (sample ), list )
@@ -378,122 +380,40 @@ def test_gauss(self):
378
380
self .assertEqual (x1 , x2 )
379
381
self .assertEqual (y1 , y2 )
380
382
383
+ def test_53_bits_per_float (self ):
384
+ # This should pass whenever a C double has 53 bit precision.
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
+
381
391
def test_getrandbits (self ):
392
+ getrandbits = self .gen .getrandbits
382
393
# Verify ranges
383
394
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 )
386
397
387
398
# Verify all bits active
388
- getbits = self .gen .getrandbits
389
399
for span in [1 , 2 , 3 , 4 , 31 , 32 , 32 , 52 , 53 , 54 , 119 , 127 , 128 , 129 ]:
390
400
all_bits = 2 ** span - 1
391
401
cum = 0
392
402
cpl_cum = 0
393
403
for i in range (100 ):
394
- v = getbits (span )
404
+ v = getrandbits (span )
395
405
cum |= v
396
406
cpl_cum |= all_bits ^ v
397
407
self .assertEqual (cum , all_bits )
398
408
self .assertEqual (cpl_cum , all_bits )
399
409
400
410
# 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 )
497
417
498
418
def test_bigrand (self ):
499
419
# The randrange routine should build-up the required number of bits
@@ -572,6 +492,10 @@ def test_randrange_step(self):
572
492
randrange (1000 , step = 100 )
573
493
with self .assertRaises (TypeError ):
574
494
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 ))
575
499
576
500
def test_randbelow_logic (self , _log = log , int = int ):
577
501
# check bitcount transition points: 2**i and 2**(i+1)-1
@@ -594,6 +518,116 @@ def test_randbelow_logic(self, _log=log, int=int):
594
518
self .assertEqual (k , numbits ) # note the stronger assertion
595
519
self .assertTrue (2 ** k > n > 2 ** (k - 1 )) # note the stronger assertion
596
520
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
+
597
631
598
632
class TestRawMersenneTwister (unittest .TestCase ):
599
633
@test .support .cpython_only
@@ -779,38 +813,6 @@ def test_long_seed(self):
779
813
seed = (1 << (10000 * 8 )) - 1 # about 10K bytes
780
814
self .gen .seed (seed )
781
815
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
816
def test_getrandbits (self ):
815
817
super ().test_getrandbits ()
816
818
@@ -848,27 +850,6 @@ def test_randrange_uses_getrandbits(self):
848
850
self .assertEqual (self .gen .randrange (2 ** 99 ),
849
851
97904845777343510404718956115 )
850
852
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
853
def test_randbelow_without_getrandbits (self ):
873
854
# Random._randbelow() can only use random() when the built-in one
874
855
# has been overridden but no new getrandbits() method was supplied.
@@ -903,14 +884,6 @@ def test_randbelow_without_getrandbits(self):
903
884
self .gen ._randbelow_without_getrandbits (n , maxsize = maxsize )
904
885
self .assertEqual (random_mock .call_count , 2 )
905
886
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
887
def test_choices_algorithms (self ):
915
888
# The various ways of specifying weights should produce the same results
916
889
choices = self .gen .choices
0 commit comments