Mercurial > cpython-lru_cache-weakref
annotate Lib/test/test_random.py @ 27998:e27f58a50737 legacy-trunk
SF bug #690377: Dud footnote reference in distutils docs
| author | Raymond Hettinger <python@rcn.com> |
|---|---|
| date | Fri, 21 Feb 2003 02:47:09 +0000 |
| parents | 107d988901a0 |
| children | c5f18db1c966 |
| rev | line source |
|---|---|
|
26829
f64c96922708
SF patch 658251: Install a C implementation of the Mersenne Twister as the
Raymond Hettinger <python@rcn.com>
parents:
24364
diff
changeset
|
1 #!/usr/bin/env python |
|
f64c96922708
SF patch 658251: Install a C implementation of the Mersenne Twister as the
Raymond Hettinger <python@rcn.com>
parents:
24364
diff
changeset
|
2 |
|
f64c96922708
SF patch 658251: Install a C implementation of the Mersenne Twister as the
Raymond Hettinger <python@rcn.com>
parents:
24364
diff
changeset
|
3 import unittest |
|
f64c96922708
SF patch 658251: Install a C implementation of the Mersenne Twister as the
Raymond Hettinger <python@rcn.com>
parents:
24364
diff
changeset
|
4 import random |
|
f64c96922708
SF patch 658251: Install a C implementation of the Mersenne Twister as the
Raymond Hettinger <python@rcn.com>
parents:
24364
diff
changeset
|
5 import time |
|
27094
e841c873a937
Move the statistical tests for four distributions into the unittest suite.
Raymond Hettinger <python@rcn.com>
parents:
27092
diff
changeset
|
6 from math import log, exp, sqrt, pi |
|
27279
9de064c7a247
* Migrate sample distribution test from random.py to test_random.py.
Raymond Hettinger <python@rcn.com>
parents:
27094
diff
changeset
|
7 from sets import Set |
|
24364
aa0d2d51fbde
Get rid of relative imports in all unittests. Now anything that
Barry Warsaw <barry@python.org>
parents:
23380
diff
changeset
|
8 from test import test_support |
|
26829
f64c96922708
SF patch 658251: Install a C implementation of the Mersenne Twister as the
Raymond Hettinger <python@rcn.com>
parents:
24364
diff
changeset
|
9 |
|
f64c96922708
SF patch 658251: Install a C implementation of the Mersenne Twister as the
Raymond Hettinger <python@rcn.com>
parents:
24364
diff
changeset
|
10 class TestBasicOps(unittest.TestCase): |
|
f64c96922708
SF patch 658251: Install a C implementation of the Mersenne Twister as the
Raymond Hettinger <python@rcn.com>
parents:
24364
diff
changeset
|
11 # Superclass with tests common to all generators. |
|
f64c96922708
SF patch 658251: Install a C implementation of the Mersenne Twister as the
Raymond Hettinger <python@rcn.com>
parents:
24364
diff
changeset
|
12 # Subclasses must arrange for self.gen to retrieve the Random instance |
|
f64c96922708
SF patch 658251: Install a C implementation of the Mersenne Twister as the
Raymond Hettinger <python@rcn.com>
parents:
24364
diff
changeset
|
13 # to be tested. |
|
f64c96922708
SF patch 658251: Install a C implementation of the Mersenne Twister as the
Raymond Hettinger <python@rcn.com>
parents:
24364
diff
changeset
|
14 |
|
f64c96922708
SF patch 658251: Install a C implementation of the Mersenne Twister as the
Raymond Hettinger <python@rcn.com>
parents:
24364
diff
changeset
|
15 def randomlist(self, n): |
|
f64c96922708
SF patch 658251: Install a C implementation of the Mersenne Twister as the
Raymond Hettinger <python@rcn.com>
parents:
24364
diff
changeset
|
16 """Helper function to make a list of random numbers""" |
|
f64c96922708
SF patch 658251: Install a C implementation of the Mersenne Twister as the
Raymond Hettinger <python@rcn.com>
parents:
24364
diff
changeset
|
17 return [self.gen.random() for i in xrange(n)] |
|
f64c96922708
SF patch 658251: Install a C implementation of the Mersenne Twister as the
Raymond Hettinger <python@rcn.com>
parents:
24364
diff
changeset
|
18 |
|
f64c96922708
SF patch 658251: Install a C implementation of the Mersenne Twister as the
Raymond Hettinger <python@rcn.com>
parents:
24364
diff
changeset
|
19 def test_autoseed(self): |
|
f64c96922708
SF patch 658251: Install a C implementation of the Mersenne Twister as the
Raymond Hettinger <python@rcn.com>
parents:
24364
diff
changeset
|
20 self.gen.seed() |
|
f64c96922708
SF patch 658251: Install a C implementation of the Mersenne Twister as the
Raymond Hettinger <python@rcn.com>
parents:
24364
diff
changeset
|
21 state1 = self.gen.getstate() |
|
27996
107d988901a0
SF bug #690083: test_random fails sometimes
Raymond Hettinger <python@rcn.com>
parents:
27668
diff
changeset
|
22 time.sleep(1.1) |
|
26829
f64c96922708
SF patch 658251: Install a C implementation of the Mersenne Twister as the
Raymond Hettinger <python@rcn.com>
parents:
24364
diff
changeset
|
23 self.gen.seed() # diffent seeds at different times |
|
f64c96922708
SF patch 658251: Install a C implementation of the Mersenne Twister as the
Raymond Hettinger <python@rcn.com>
parents:
24364
diff
changeset
|
24 state2 = self.gen.getstate() |
|
f64c96922708
SF patch 658251: Install a C implementation of the Mersenne Twister as the
Raymond Hettinger <python@rcn.com>
parents:
24364
diff
changeset
|
25 self.assertNotEqual(state1, state2) |
|
f64c96922708
SF patch 658251: Install a C implementation of the Mersenne Twister as the
Raymond Hettinger <python@rcn.com>
parents:
24364
diff
changeset
|
26 |
|
f64c96922708
SF patch 658251: Install a C implementation of the Mersenne Twister as the
Raymond Hettinger <python@rcn.com>
parents:
24364
diff
changeset
|
27 def test_saverestore(self): |
|
f64c96922708
SF patch 658251: Install a C implementation of the Mersenne Twister as the
Raymond Hettinger <python@rcn.com>
parents:
24364
diff
changeset
|
28 N = 1000 |
|
f64c96922708
SF patch 658251: Install a C implementation of the Mersenne Twister as the
Raymond Hettinger <python@rcn.com>
parents:
24364
diff
changeset
|
29 self.gen.seed() |
|
f64c96922708
SF patch 658251: Install a C implementation of the Mersenne Twister as the
Raymond Hettinger <python@rcn.com>
parents:
24364
diff
changeset
|
30 state = self.gen.getstate() |
|
f64c96922708
SF patch 658251: Install a C implementation of the Mersenne Twister as the
Raymond Hettinger <python@rcn.com>
parents:
24364
diff
changeset
|
31 randseq = self.randomlist(N) |
|
f64c96922708
SF patch 658251: Install a C implementation of the Mersenne Twister as the
Raymond Hettinger <python@rcn.com>
parents:
24364
diff
changeset
|
32 self.gen.setstate(state) # should regenerate the same sequence |
|
f64c96922708
SF patch 658251: Install a C implementation of the Mersenne Twister as the
Raymond Hettinger <python@rcn.com>
parents:
24364
diff
changeset
|
33 self.assertEqual(randseq, self.randomlist(N)) |
|
f64c96922708
SF patch 658251: Install a C implementation of the Mersenne Twister as the
Raymond Hettinger <python@rcn.com>
parents:
24364
diff
changeset
|
34 |
|
f64c96922708
SF patch 658251: Install a C implementation of the Mersenne Twister as the
Raymond Hettinger <python@rcn.com>
parents:
24364
diff
changeset
|
35 def test_seedargs(self): |
|
f64c96922708
SF patch 658251: Install a C implementation of the Mersenne Twister as the
Raymond Hettinger <python@rcn.com>
parents:
24364
diff
changeset
|
36 for arg in [None, 0, 0L, 1, 1L, -1, -1L, 10**20, -(10**20), |
|
f64c96922708
SF patch 658251: Install a C implementation of the Mersenne Twister as the
Raymond Hettinger <python@rcn.com>
parents:
24364
diff
changeset
|
37 3.14, 1+2j, 'a', tuple('abc')]: |
|
f64c96922708
SF patch 658251: Install a C implementation of the Mersenne Twister as the
Raymond Hettinger <python@rcn.com>
parents:
24364
diff
changeset
|
38 self.gen.seed(arg) |
|
f64c96922708
SF patch 658251: Install a C implementation of the Mersenne Twister as the
Raymond Hettinger <python@rcn.com>
parents:
24364
diff
changeset
|
39 for arg in [range(3), dict(one=1)]: |
|
f64c96922708
SF patch 658251: Install a C implementation of the Mersenne Twister as the
Raymond Hettinger <python@rcn.com>
parents:
24364
diff
changeset
|
40 self.assertRaises(TypeError, self.gen.seed, arg) |
|
f64c96922708
SF patch 658251: Install a C implementation of the Mersenne Twister as the
Raymond Hettinger <python@rcn.com>
parents:
24364
diff
changeset
|
41 |
|
f64c96922708
SF patch 658251: Install a C implementation of the Mersenne Twister as the
Raymond Hettinger <python@rcn.com>
parents:
24364
diff
changeset
|
42 def test_jumpahead(self): |
|
f64c96922708
SF patch 658251: Install a C implementation of the Mersenne Twister as the
Raymond Hettinger <python@rcn.com>
parents:
24364
diff
changeset
|
43 self.gen.seed() |
|
f64c96922708
SF patch 658251: Install a C implementation of the Mersenne Twister as the
Raymond Hettinger <python@rcn.com>
parents:
24364
diff
changeset
|
44 state1 = self.gen.getstate() |
|
f64c96922708
SF patch 658251: Install a C implementation of the Mersenne Twister as the
Raymond Hettinger <python@rcn.com>
parents:
24364
diff
changeset
|
45 self.gen.jumpahead(100) |
|
f64c96922708
SF patch 658251: Install a C implementation of the Mersenne Twister as the
Raymond Hettinger <python@rcn.com>
parents:
24364
diff
changeset
|
46 state2 = self.gen.getstate() # s/b distinct from state1 |
|
f64c96922708
SF patch 658251: Install a C implementation of the Mersenne Twister as the
Raymond Hettinger <python@rcn.com>
parents:
24364
diff
changeset
|
47 self.assertNotEqual(state1, state2) |
|
f64c96922708
SF patch 658251: Install a C implementation of the Mersenne Twister as the
Raymond Hettinger <python@rcn.com>
parents:
24364
diff
changeset
|
48 self.gen.jumpahead(100) |
|
f64c96922708
SF patch 658251: Install a C implementation of the Mersenne Twister as the
Raymond Hettinger <python@rcn.com>
parents:
24364
diff
changeset
|
49 state3 = self.gen.getstate() # s/b distinct from state2 |
|
f64c96922708
SF patch 658251: Install a C implementation of the Mersenne Twister as the
Raymond Hettinger <python@rcn.com>
parents:
24364
diff
changeset
|
50 self.assertNotEqual(state2, state3) |
|
23380
9be01b7b6c80
random.gauss() uses a piece of hidden state used by nothing else,
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
51 |
|
26829
f64c96922708
SF patch 658251: Install a C implementation of the Mersenne Twister as the
Raymond Hettinger <python@rcn.com>
parents:
24364
diff
changeset
|
52 self.assertRaises(TypeError, self.gen.jumpahead) # needs an arg |
|
f64c96922708
SF patch 658251: Install a C implementation of the Mersenne Twister as the
Raymond Hettinger <python@rcn.com>
parents:
24364
diff
changeset
|
53 self.assertRaises(TypeError, self.gen.jumpahead, "ick") # wrong type |
|
f64c96922708
SF patch 658251: Install a C implementation of the Mersenne Twister as the
Raymond Hettinger <python@rcn.com>
parents:
24364
diff
changeset
|
54 self.assertRaises(TypeError, self.gen.jumpahead, 2.3) # wrong type |
|
f64c96922708
SF patch 658251: Install a C implementation of the Mersenne Twister as the
Raymond Hettinger <python@rcn.com>
parents:
24364
diff
changeset
|
55 self.assertRaises(TypeError, self.gen.jumpahead, 2, 3) # too many |
|
f64c96922708
SF patch 658251: Install a C implementation of the Mersenne Twister as the
Raymond Hettinger <python@rcn.com>
parents:
24364
diff
changeset
|
56 |
|
f64c96922708
SF patch 658251: Install a C implementation of the Mersenne Twister as the
Raymond Hettinger <python@rcn.com>
parents:
24364
diff
changeset
|
57 def test_sample(self): |
|
f64c96922708
SF patch 658251: Install a C implementation of the Mersenne Twister as the
Raymond Hettinger <python@rcn.com>
parents:
24364
diff
changeset
|
58 # For the entire allowable range of 0 <= k <= N, validate that |
|
f64c96922708
SF patch 658251: Install a C implementation of the Mersenne Twister as the
Raymond Hettinger <python@rcn.com>
parents:
24364
diff
changeset
|
59 # the sample is of the correct length and contains only unique items |
|
f64c96922708
SF patch 658251: Install a C implementation of the Mersenne Twister as the
Raymond Hettinger <python@rcn.com>
parents:
24364
diff
changeset
|
60 N = 100 |
|
f64c96922708
SF patch 658251: Install a C implementation of the Mersenne Twister as the
Raymond Hettinger <python@rcn.com>
parents:
24364
diff
changeset
|
61 population = xrange(N) |
|
f64c96922708
SF patch 658251: Install a C implementation of the Mersenne Twister as the
Raymond Hettinger <python@rcn.com>
parents:
24364
diff
changeset
|
62 for k in xrange(N+1): |
|
f64c96922708
SF patch 658251: Install a C implementation of the Mersenne Twister as the
Raymond Hettinger <python@rcn.com>
parents:
24364
diff
changeset
|
63 s = self.gen.sample(population, k) |
|
f64c96922708
SF patch 658251: Install a C implementation of the Mersenne Twister as the
Raymond Hettinger <python@rcn.com>
parents:
24364
diff
changeset
|
64 self.assertEqual(len(s), k) |
|
27279
9de064c7a247
* Migrate sample distribution test from random.py to test_random.py.
Raymond Hettinger <python@rcn.com>
parents:
27094
diff
changeset
|
65 uniq = Set(s) |
|
26829
f64c96922708
SF patch 658251: Install a C implementation of the Mersenne Twister as the
Raymond Hettinger <python@rcn.com>
parents:
24364
diff
changeset
|
66 self.assertEqual(len(uniq), k) |
|
27279
9de064c7a247
* Migrate sample distribution test from random.py to test_random.py.
Raymond Hettinger <python@rcn.com>
parents:
27094
diff
changeset
|
67 self.failUnless(uniq <= Set(population)) |
|
27081
3199e974f55a
Test an edge case for sample().
Raymond Hettinger <python@rcn.com>
parents:
26829
diff
changeset
|
68 self.assertEqual(self.gen.sample([], 0), []) # test edge case N==k==0 |
|
26829
f64c96922708
SF patch 658251: Install a C implementation of the Mersenne Twister as the
Raymond Hettinger <python@rcn.com>
parents:
24364
diff
changeset
|
69 |
|
27279
9de064c7a247
* Migrate sample distribution test from random.py to test_random.py.
Raymond Hettinger <python@rcn.com>
parents:
27094
diff
changeset
|
70 def test_sample_distribution(self): |
|
9de064c7a247
* Migrate sample distribution test from random.py to test_random.py.
Raymond Hettinger <python@rcn.com>
parents:
27094
diff
changeset
|
71 # For the entire allowable range of 0 <= k <= N, validate that |
|
9de064c7a247
* Migrate sample distribution test from random.py to test_random.py.
Raymond Hettinger <python@rcn.com>
parents:
27094
diff
changeset
|
72 # sample generates all possible permutations |
|
9de064c7a247
* Migrate sample distribution test from random.py to test_random.py.
Raymond Hettinger <python@rcn.com>
parents:
27094
diff
changeset
|
73 n = 5 |
|
9de064c7a247
* Migrate sample distribution test from random.py to test_random.py.
Raymond Hettinger <python@rcn.com>
parents:
27094
diff
changeset
|
74 pop = range(n) |
|
9de064c7a247
* Migrate sample distribution test from random.py to test_random.py.
Raymond Hettinger <python@rcn.com>
parents:
27094
diff
changeset
|
75 trials = 10000 # large num prevents false negatives without slowing normal case |
|
9de064c7a247
* Migrate sample distribution test from random.py to test_random.py.
Raymond Hettinger <python@rcn.com>
parents:
27094
diff
changeset
|
76 def factorial(n): |
| 27668 | 77 return reduce(int.__mul__, xrange(1, n), 1) |
|
27279
9de064c7a247
* Migrate sample distribution test from random.py to test_random.py.
Raymond Hettinger <python@rcn.com>
parents:
27094
diff
changeset
|
78 for k in xrange(n): |
|
9de064c7a247
* Migrate sample distribution test from random.py to test_random.py.
Raymond Hettinger <python@rcn.com>
parents:
27094
diff
changeset
|
79 expected = factorial(n) / factorial(n-k) |
|
9de064c7a247
* Migrate sample distribution test from random.py to test_random.py.
Raymond Hettinger <python@rcn.com>
parents:
27094
diff
changeset
|
80 perms = {} |
|
9de064c7a247
* Migrate sample distribution test from random.py to test_random.py.
Raymond Hettinger <python@rcn.com>
parents:
27094
diff
changeset
|
81 for i in xrange(trials): |
|
9de064c7a247
* Migrate sample distribution test from random.py to test_random.py.
Raymond Hettinger <python@rcn.com>
parents:
27094
diff
changeset
|
82 perms[tuple(self.gen.sample(pop, k))] = None |
|
9de064c7a247
* Migrate sample distribution test from random.py to test_random.py.
Raymond Hettinger <python@rcn.com>
parents:
27094
diff
changeset
|
83 if len(perms) == expected: |
|
9de064c7a247
* Migrate sample distribution test from random.py to test_random.py.
Raymond Hettinger <python@rcn.com>
parents:
27094
diff
changeset
|
84 break |
|
9de064c7a247
* Migrate sample distribution test from random.py to test_random.py.
Raymond Hettinger <python@rcn.com>
parents:
27094
diff
changeset
|
85 else: |
|
9de064c7a247
* Migrate sample distribution test from random.py to test_random.py.
Raymond Hettinger <python@rcn.com>
parents:
27094
diff
changeset
|
86 self.fail() |
|
9de064c7a247
* Migrate sample distribution test from random.py to test_random.py.
Raymond Hettinger <python@rcn.com>
parents:
27094
diff
changeset
|
87 |
|
26829
f64c96922708
SF patch 658251: Install a C implementation of the Mersenne Twister as the
Raymond Hettinger <python@rcn.com>
parents:
24364
diff
changeset
|
88 def test_gauss(self): |
|
f64c96922708
SF patch 658251: Install a C implementation of the Mersenne Twister as the
Raymond Hettinger <python@rcn.com>
parents:
24364
diff
changeset
|
89 # Ensure that the seed() method initializes all the hidden state. In |
|
f64c96922708
SF patch 658251: Install a C implementation of the Mersenne Twister as the
Raymond Hettinger <python@rcn.com>
parents:
24364
diff
changeset
|
90 # particular, through 2.2.1 it failed to reset a piece of state used |
|
f64c96922708
SF patch 658251: Install a C implementation of the Mersenne Twister as the
Raymond Hettinger <python@rcn.com>
parents:
24364
diff
changeset
|
91 # by (and only by) the .gauss() method. |
|
f64c96922708
SF patch 658251: Install a C implementation of the Mersenne Twister as the
Raymond Hettinger <python@rcn.com>
parents:
24364
diff
changeset
|
92 |
|
f64c96922708
SF patch 658251: Install a C implementation of the Mersenne Twister as the
Raymond Hettinger <python@rcn.com>
parents:
24364
diff
changeset
|
93 for seed in 1, 12, 123, 1234, 12345, 123456, 654321: |
|
f64c96922708
SF patch 658251: Install a C implementation of the Mersenne Twister as the
Raymond Hettinger <python@rcn.com>
parents:
24364
diff
changeset
|
94 self.gen.seed(seed) |
|
f64c96922708
SF patch 658251: Install a C implementation of the Mersenne Twister as the
Raymond Hettinger <python@rcn.com>
parents:
24364
diff
changeset
|
95 x1 = self.gen.random() |
|
f64c96922708
SF patch 658251: Install a C implementation of the Mersenne Twister as the
Raymond Hettinger <python@rcn.com>
parents:
24364
diff
changeset
|
96 y1 = self.gen.gauss(0, 1) |
|
f64c96922708
SF patch 658251: Install a C implementation of the Mersenne Twister as the
Raymond Hettinger <python@rcn.com>
parents:
24364
diff
changeset
|
97 |
|
f64c96922708
SF patch 658251: Install a C implementation of the Mersenne Twister as the
Raymond Hettinger <python@rcn.com>
parents:
24364
diff
changeset
|
98 self.gen.seed(seed) |
|
f64c96922708
SF patch 658251: Install a C implementation of the Mersenne Twister as the
Raymond Hettinger <python@rcn.com>
parents:
24364
diff
changeset
|
99 x2 = self.gen.random() |
|
f64c96922708
SF patch 658251: Install a C implementation of the Mersenne Twister as the
Raymond Hettinger <python@rcn.com>
parents:
24364
diff
changeset
|
100 y2 = self.gen.gauss(0, 1) |
|
f64c96922708
SF patch 658251: Install a C implementation of the Mersenne Twister as the
Raymond Hettinger <python@rcn.com>
parents:
24364
diff
changeset
|
101 |
|
f64c96922708
SF patch 658251: Install a C implementation of the Mersenne Twister as the
Raymond Hettinger <python@rcn.com>
parents:
24364
diff
changeset
|
102 self.assertEqual(x1, x2) |
|
f64c96922708
SF patch 658251: Install a C implementation of the Mersenne Twister as the
Raymond Hettinger <python@rcn.com>
parents:
24364
diff
changeset
|
103 self.assertEqual(y1, y2) |
|
f64c96922708
SF patch 658251: Install a C implementation of the Mersenne Twister as the
Raymond Hettinger <python@rcn.com>
parents:
24364
diff
changeset
|
104 |
|
f64c96922708
SF patch 658251: Install a C implementation of the Mersenne Twister as the
Raymond Hettinger <python@rcn.com>
parents:
24364
diff
changeset
|
105 |
|
f64c96922708
SF patch 658251: Install a C implementation of the Mersenne Twister as the
Raymond Hettinger <python@rcn.com>
parents:
24364
diff
changeset
|
106 class WichmannHill_TestBasicOps(TestBasicOps): |
|
f64c96922708
SF patch 658251: Install a C implementation of the Mersenne Twister as the
Raymond Hettinger <python@rcn.com>
parents:
24364
diff
changeset
|
107 gen = random.WichmannHill() |
|
f64c96922708
SF patch 658251: Install a C implementation of the Mersenne Twister as the
Raymond Hettinger <python@rcn.com>
parents:
24364
diff
changeset
|
108 |
|
f64c96922708
SF patch 658251: Install a C implementation of the Mersenne Twister as the
Raymond Hettinger <python@rcn.com>
parents:
24364
diff
changeset
|
109 def test_strong_jumpahead(self): |
|
f64c96922708
SF patch 658251: Install a C implementation of the Mersenne Twister as the
Raymond Hettinger <python@rcn.com>
parents:
24364
diff
changeset
|
110 # tests that jumpahead(n) semantics correspond to n calls to random() |
|
f64c96922708
SF patch 658251: Install a C implementation of the Mersenne Twister as the
Raymond Hettinger <python@rcn.com>
parents:
24364
diff
changeset
|
111 N = 1000 |
|
f64c96922708
SF patch 658251: Install a C implementation of the Mersenne Twister as the
Raymond Hettinger <python@rcn.com>
parents:
24364
diff
changeset
|
112 s = self.gen.getstate() |
|
f64c96922708
SF patch 658251: Install a C implementation of the Mersenne Twister as the
Raymond Hettinger <python@rcn.com>
parents:
24364
diff
changeset
|
113 self.gen.jumpahead(N) |
|
f64c96922708
SF patch 658251: Install a C implementation of the Mersenne Twister as the
Raymond Hettinger <python@rcn.com>
parents:
24364
diff
changeset
|
114 r1 = self.gen.random() |
|
f64c96922708
SF patch 658251: Install a C implementation of the Mersenne Twister as the
Raymond Hettinger <python@rcn.com>
parents:
24364
diff
changeset
|
115 # now do it the slow way |
|
f64c96922708
SF patch 658251: Install a C implementation of the Mersenne Twister as the
Raymond Hettinger <python@rcn.com>
parents:
24364
diff
changeset
|
116 self.gen.setstate(s) |
|
f64c96922708
SF patch 658251: Install a C implementation of the Mersenne Twister as the
Raymond Hettinger <python@rcn.com>
parents:
24364
diff
changeset
|
117 for i in xrange(N): |
|
f64c96922708
SF patch 658251: Install a C implementation of the Mersenne Twister as the
Raymond Hettinger <python@rcn.com>
parents:
24364
diff
changeset
|
118 self.gen.random() |
|
f64c96922708
SF patch 658251: Install a C implementation of the Mersenne Twister as the
Raymond Hettinger <python@rcn.com>
parents:
24364
diff
changeset
|
119 r2 = self.gen.random() |
|
f64c96922708
SF patch 658251: Install a C implementation of the Mersenne Twister as the
Raymond Hettinger <python@rcn.com>
parents:
24364
diff
changeset
|
120 self.assertEqual(r1, r2) |
|
23380
9be01b7b6c80
random.gauss() uses a piece of hidden state used by nothing else,
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
121 |
|
26829
f64c96922708
SF patch 658251: Install a C implementation of the Mersenne Twister as the
Raymond Hettinger <python@rcn.com>
parents:
24364
diff
changeset
|
122 def test_gauss_with_whseed(self): |
|
f64c96922708
SF patch 658251: Install a C implementation of the Mersenne Twister as the
Raymond Hettinger <python@rcn.com>
parents:
24364
diff
changeset
|
123 # Ensure that the seed() method initializes all the hidden state. In |
|
f64c96922708
SF patch 658251: Install a C implementation of the Mersenne Twister as the
Raymond Hettinger <python@rcn.com>
parents:
24364
diff
changeset
|
124 # particular, through 2.2.1 it failed to reset a piece of state used |
|
f64c96922708
SF patch 658251: Install a C implementation of the Mersenne Twister as the
Raymond Hettinger <python@rcn.com>
parents:
24364
diff
changeset
|
125 # by (and only by) the .gauss() method. |
|
f64c96922708
SF patch 658251: Install a C implementation of the Mersenne Twister as the
Raymond Hettinger <python@rcn.com>
parents:
24364
diff
changeset
|
126 |
|
f64c96922708
SF patch 658251: Install a C implementation of the Mersenne Twister as the
Raymond Hettinger <python@rcn.com>
parents:
24364
diff
changeset
|
127 for seed in 1, 12, 123, 1234, 12345, 123456, 654321: |
|
f64c96922708
SF patch 658251: Install a C implementation of the Mersenne Twister as the
Raymond Hettinger <python@rcn.com>
parents:
24364
diff
changeset
|
128 self.gen.whseed(seed) |
|
f64c96922708
SF patch 658251: Install a C implementation of the Mersenne Twister as the
Raymond Hettinger <python@rcn.com>
parents:
24364
diff
changeset
|
129 x1 = self.gen.random() |
|
f64c96922708
SF patch 658251: Install a C implementation of the Mersenne Twister as the
Raymond Hettinger <python@rcn.com>
parents:
24364
diff
changeset
|
130 y1 = self.gen.gauss(0, 1) |
|
f64c96922708
SF patch 658251: Install a C implementation of the Mersenne Twister as the
Raymond Hettinger <python@rcn.com>
parents:
24364
diff
changeset
|
131 |
|
f64c96922708
SF patch 658251: Install a C implementation of the Mersenne Twister as the
Raymond Hettinger <python@rcn.com>
parents:
24364
diff
changeset
|
132 self.gen.whseed(seed) |
|
f64c96922708
SF patch 658251: Install a C implementation of the Mersenne Twister as the
Raymond Hettinger <python@rcn.com>
parents:
24364
diff
changeset
|
133 x2 = self.gen.random() |
|
f64c96922708
SF patch 658251: Install a C implementation of the Mersenne Twister as the
Raymond Hettinger <python@rcn.com>
parents:
24364
diff
changeset
|
134 y2 = self.gen.gauss(0, 1) |
|
f64c96922708
SF patch 658251: Install a C implementation of the Mersenne Twister as the
Raymond Hettinger <python@rcn.com>
parents:
24364
diff
changeset
|
135 |
|
f64c96922708
SF patch 658251: Install a C implementation of the Mersenne Twister as the
Raymond Hettinger <python@rcn.com>
parents:
24364
diff
changeset
|
136 self.assertEqual(x1, x2) |
|
f64c96922708
SF patch 658251: Install a C implementation of the Mersenne Twister as the
Raymond Hettinger <python@rcn.com>
parents:
24364
diff
changeset
|
137 self.assertEqual(y1, y2) |
|
f64c96922708
SF patch 658251: Install a C implementation of the Mersenne Twister as the
Raymond Hettinger <python@rcn.com>
parents:
24364
diff
changeset
|
138 |
|
f64c96922708
SF patch 658251: Install a C implementation of the Mersenne Twister as the
Raymond Hettinger <python@rcn.com>
parents:
24364
diff
changeset
|
139 class MersenneTwister_TestBasicOps(TestBasicOps): |
|
f64c96922708
SF patch 658251: Install a C implementation of the Mersenne Twister as the
Raymond Hettinger <python@rcn.com>
parents:
24364
diff
changeset
|
140 gen = random.Random() |
|
f64c96922708
SF patch 658251: Install a C implementation of the Mersenne Twister as the
Raymond Hettinger <python@rcn.com>
parents:
24364
diff
changeset
|
141 |
|
f64c96922708
SF patch 658251: Install a C implementation of the Mersenne Twister as the
Raymond Hettinger <python@rcn.com>
parents:
24364
diff
changeset
|
142 def test_referenceImplementation(self): |
|
f64c96922708
SF patch 658251: Install a C implementation of the Mersenne Twister as the
Raymond Hettinger <python@rcn.com>
parents:
24364
diff
changeset
|
143 # Compare the python implementation with results from the original |
|
f64c96922708
SF patch 658251: Install a C implementation of the Mersenne Twister as the
Raymond Hettinger <python@rcn.com>
parents:
24364
diff
changeset
|
144 # code. Create 2000 53-bit precision random floats. Compare only |
|
f64c96922708
SF patch 658251: Install a C implementation of the Mersenne Twister as the
Raymond Hettinger <python@rcn.com>
parents:
24364
diff
changeset
|
145 # the last ten entries to show that the independent implementations |
|
f64c96922708
SF patch 658251: Install a C implementation of the Mersenne Twister as the
Raymond Hettinger <python@rcn.com>
parents:
24364
diff
changeset
|
146 # are tracking. Here is the main() function needed to create the |
|
f64c96922708
SF patch 658251: Install a C implementation of the Mersenne Twister as the
Raymond Hettinger <python@rcn.com>
parents:
24364
diff
changeset
|
147 # list of expected random numbers: |
|
f64c96922708
SF patch 658251: Install a C implementation of the Mersenne Twister as the
Raymond Hettinger <python@rcn.com>
parents:
24364
diff
changeset
|
148 # void main(void){ |
|
f64c96922708
SF patch 658251: Install a C implementation of the Mersenne Twister as the
Raymond Hettinger <python@rcn.com>
parents:
24364
diff
changeset
|
149 # int i; |
|
f64c96922708
SF patch 658251: Install a C implementation of the Mersenne Twister as the
Raymond Hettinger <python@rcn.com>
parents:
24364
diff
changeset
|
150 # unsigned long init[4]={61731, 24903, 614, 42143}, length=4; |
|
f64c96922708
SF patch 658251: Install a C implementation of the Mersenne Twister as the
Raymond Hettinger <python@rcn.com>
parents:
24364
diff
changeset
|
151 # init_by_array(init, length); |
|
f64c96922708
SF patch 658251: Install a C implementation of the Mersenne Twister as the
Raymond Hettinger <python@rcn.com>
parents:
24364
diff
changeset
|
152 # for (i=0; i<2000; i++) { |
|
f64c96922708
SF patch 658251: Install a C implementation of the Mersenne Twister as the
Raymond Hettinger <python@rcn.com>
parents:
24364
diff
changeset
|
153 # printf("%.15f ", genrand_res53()); |
|
f64c96922708
SF patch 658251: Install a C implementation of the Mersenne Twister as the
Raymond Hettinger <python@rcn.com>
parents:
24364
diff
changeset
|
154 # if (i%5==4) printf("\n"); |
|
f64c96922708
SF patch 658251: Install a C implementation of the Mersenne Twister as the
Raymond Hettinger <python@rcn.com>
parents:
24364
diff
changeset
|
155 # } |
|
f64c96922708
SF patch 658251: Install a C implementation of the Mersenne Twister as the
Raymond Hettinger <python@rcn.com>
parents:
24364
diff
changeset
|
156 # } |
|
f64c96922708
SF patch 658251: Install a C implementation of the Mersenne Twister as the
Raymond Hettinger <python@rcn.com>
parents:
24364
diff
changeset
|
157 expected = [0.45839803073713259, |
|
f64c96922708
SF patch 658251: Install a C implementation of the Mersenne Twister as the
Raymond Hettinger <python@rcn.com>
parents:
24364
diff
changeset
|
158 0.86057815201978782, |
|
f64c96922708
SF patch 658251: Install a C implementation of the Mersenne Twister as the
Raymond Hettinger <python@rcn.com>
parents:
24364
diff
changeset
|
159 0.92848331726782152, |
|
f64c96922708
SF patch 658251: Install a C implementation of the Mersenne Twister as the
Raymond Hettinger <python@rcn.com>
parents:
24364
diff
changeset
|
160 0.35932681119782461, |
|
f64c96922708
SF patch 658251: Install a C implementation of the Mersenne Twister as the
Raymond Hettinger <python@rcn.com>
parents:
24364
diff
changeset
|
161 0.081823493762449573, |
|
f64c96922708
SF patch 658251: Install a C implementation of the Mersenne Twister as the
Raymond Hettinger <python@rcn.com>
parents:
24364
diff
changeset
|
162 0.14332226470169329, |
|
f64c96922708
SF patch 658251: Install a C implementation of the Mersenne Twister as the
Raymond Hettinger <python@rcn.com>
parents:
24364
diff
changeset
|
163 0.084297823823520024, |
|
f64c96922708
SF patch 658251: Install a C implementation of the Mersenne Twister as the
Raymond Hettinger <python@rcn.com>
parents:
24364
diff
changeset
|
164 0.53814864671831453, |
|
f64c96922708
SF patch 658251: Install a C implementation of the Mersenne Twister as the
Raymond Hettinger <python@rcn.com>
parents:
24364
diff
changeset
|
165 0.089215024911993401, |
|
f64c96922708
SF patch 658251: Install a C implementation of the Mersenne Twister as the
Raymond Hettinger <python@rcn.com>
parents:
24364
diff
changeset
|
166 0.78486196105372907] |
|
f64c96922708
SF patch 658251: Install a C implementation of the Mersenne Twister as the
Raymond Hettinger <python@rcn.com>
parents:
24364
diff
changeset
|
167 |
|
f64c96922708
SF patch 658251: Install a C implementation of the Mersenne Twister as the
Raymond Hettinger <python@rcn.com>
parents:
24364
diff
changeset
|
168 self.gen.seed(61731L + (24903L<<32) + (614L<<64) + (42143L<<96)) |
|
f64c96922708
SF patch 658251: Install a C implementation of the Mersenne Twister as the
Raymond Hettinger <python@rcn.com>
parents:
24364
diff
changeset
|
169 actual = self.randomlist(2000)[-10:] |
|
f64c96922708
SF patch 658251: Install a C implementation of the Mersenne Twister as the
Raymond Hettinger <python@rcn.com>
parents:
24364
diff
changeset
|
170 for a, e in zip(actual, expected): |
|
f64c96922708
SF patch 658251: Install a C implementation of the Mersenne Twister as the
Raymond Hettinger <python@rcn.com>
parents:
24364
diff
changeset
|
171 self.assertAlmostEqual(a,e,places=14) |
|
23380
9be01b7b6c80
random.gauss() uses a piece of hidden state used by nothing else,
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
172 |
|
26829
f64c96922708
SF patch 658251: Install a C implementation of the Mersenne Twister as the
Raymond Hettinger <python@rcn.com>
parents:
24364
diff
changeset
|
173 def test_strong_reference_implementation(self): |
|
f64c96922708
SF patch 658251: Install a C implementation of the Mersenne Twister as the
Raymond Hettinger <python@rcn.com>
parents:
24364
diff
changeset
|
174 # Like test_referenceImplementation, but checks for exact bit-level |
|
f64c96922708
SF patch 658251: Install a C implementation of the Mersenne Twister as the
Raymond Hettinger <python@rcn.com>
parents:
24364
diff
changeset
|
175 # equality. This should pass on any box where C double contains |
|
f64c96922708
SF patch 658251: Install a C implementation of the Mersenne Twister as the
Raymond Hettinger <python@rcn.com>
parents:
24364
diff
changeset
|
176 # at least 53 bits of precision (the underlying algorithm suffers |
|
f64c96922708
SF patch 658251: Install a C implementation of the Mersenne Twister as the
Raymond Hettinger <python@rcn.com>
parents:
24364
diff
changeset
|
177 # no rounding errors -- all results are exact). |
|
f64c96922708
SF patch 658251: Install a C implementation of the Mersenne Twister as the
Raymond Hettinger <python@rcn.com>
parents:
24364
diff
changeset
|
178 from math import ldexp |
|
f64c96922708
SF patch 658251: Install a C implementation of the Mersenne Twister as the
Raymond Hettinger <python@rcn.com>
parents:
24364
diff
changeset
|
179 |
|
f64c96922708
SF patch 658251: Install a C implementation of the Mersenne Twister as the
Raymond Hettinger <python@rcn.com>
parents:
24364
diff
changeset
|
180 expected = [0x0eab3258d2231fL, |
|
f64c96922708
SF patch 658251: Install a C implementation of the Mersenne Twister as the
Raymond Hettinger <python@rcn.com>
parents:
24364
diff
changeset
|
181 0x1b89db315277a5L, |
|
f64c96922708
SF patch 658251: Install a C implementation of the Mersenne Twister as the
Raymond Hettinger <python@rcn.com>
parents:
24364
diff
changeset
|
182 0x1db622a5518016L, |
|
f64c96922708
SF patch 658251: Install a C implementation of the Mersenne Twister as the
Raymond Hettinger <python@rcn.com>
parents:
24364
diff
changeset
|
183 0x0b7f9af0d575bfL, |
|
f64c96922708
SF patch 658251: Install a C implementation of the Mersenne Twister as the
Raymond Hettinger <python@rcn.com>
parents:
24364
diff
changeset
|
184 0x029e4c4db82240L, |
|
f64c96922708
SF patch 658251: Install a C implementation of the Mersenne Twister as the
Raymond Hettinger <python@rcn.com>
parents:
24364
diff
changeset
|
185 0x04961892f5d673L, |
|
f64c96922708
SF patch 658251: Install a C implementation of the Mersenne Twister as the
Raymond Hettinger <python@rcn.com>
parents:
24364
diff
changeset
|
186 0x02b291598e4589L, |
|
f64c96922708
SF patch 658251: Install a C implementation of the Mersenne Twister as the
Raymond Hettinger <python@rcn.com>
parents:
24364
diff
changeset
|
187 0x11388382c15694L, |
|
f64c96922708
SF patch 658251: Install a C implementation of the Mersenne Twister as the
Raymond Hettinger <python@rcn.com>
parents:
24364
diff
changeset
|
188 0x02dad977c9e1feL, |
|
f64c96922708
SF patch 658251: Install a C implementation of the Mersenne Twister as the
Raymond Hettinger <python@rcn.com>
parents:
24364
diff
changeset
|
189 0x191d96d4d334c6L] |
|
f64c96922708
SF patch 658251: Install a C implementation of the Mersenne Twister as the
Raymond Hettinger <python@rcn.com>
parents:
24364
diff
changeset
|
190 |
|
f64c96922708
SF patch 658251: Install a C implementation of the Mersenne Twister as the
Raymond Hettinger <python@rcn.com>
parents:
24364
diff
changeset
|
191 self.gen.seed(61731L + (24903L<<32) + (614L<<64) + (42143L<<96)) |
|
f64c96922708
SF patch 658251: Install a C implementation of the Mersenne Twister as the
Raymond Hettinger <python@rcn.com>
parents:
24364
diff
changeset
|
192 actual = self.randomlist(2000)[-10:] |
|
f64c96922708
SF patch 658251: Install a C implementation of the Mersenne Twister as the
Raymond Hettinger <python@rcn.com>
parents:
24364
diff
changeset
|
193 for a, e in zip(actual, expected): |
|
f64c96922708
SF patch 658251: Install a C implementation of the Mersenne Twister as the
Raymond Hettinger <python@rcn.com>
parents:
24364
diff
changeset
|
194 self.assertEqual(long(ldexp(a, 53)), e) |
|
23380
9be01b7b6c80
random.gauss() uses a piece of hidden state used by nothing else,
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
195 |
|
26829
f64c96922708
SF patch 658251: Install a C implementation of the Mersenne Twister as the
Raymond Hettinger <python@rcn.com>
parents:
24364
diff
changeset
|
196 def test_long_seed(self): |
|
f64c96922708
SF patch 658251: Install a C implementation of the Mersenne Twister as the
Raymond Hettinger <python@rcn.com>
parents:
24364
diff
changeset
|
197 # This is most interesting to run in debug mode, just to make sure |
|
f64c96922708
SF patch 658251: Install a C implementation of the Mersenne Twister as the
Raymond Hettinger <python@rcn.com>
parents:
24364
diff
changeset
|
198 # nothing blows up. Under the covers, a dynamically resized array |
|
f64c96922708
SF patch 658251: Install a C implementation of the Mersenne Twister as the
Raymond Hettinger <python@rcn.com>
parents:
24364
diff
changeset
|
199 # is allocated, consuming space proportional to the number of bits |
|
f64c96922708
SF patch 658251: Install a C implementation of the Mersenne Twister as the
Raymond Hettinger <python@rcn.com>
parents:
24364
diff
changeset
|
200 # in the seed. Unfortunately, that's a quadratic-time algorithm, |
|
f64c96922708
SF patch 658251: Install a C implementation of the Mersenne Twister as the
Raymond Hettinger <python@rcn.com>
parents:
24364
diff
changeset
|
201 # so don't make this horribly big. |
|
f64c96922708
SF patch 658251: Install a C implementation of the Mersenne Twister as the
Raymond Hettinger <python@rcn.com>
parents:
24364
diff
changeset
|
202 seed = (1L << (10000 * 8)) - 1 # about 10K bytes |
|
f64c96922708
SF patch 658251: Install a C implementation of the Mersenne Twister as the
Raymond Hettinger <python@rcn.com>
parents:
24364
diff
changeset
|
203 self.gen.seed(seed) |
|
f64c96922708
SF patch 658251: Install a C implementation of the Mersenne Twister as the
Raymond Hettinger <python@rcn.com>
parents:
24364
diff
changeset
|
204 |
|
27094
e841c873a937
Move the statistical tests for four distributions into the unittest suite.
Raymond Hettinger <python@rcn.com>
parents:
27092
diff
changeset
|
205 _gammacoeff = (0.9999999999995183, 676.5203681218835, -1259.139216722289, |
|
e841c873a937
Move the statistical tests for four distributions into the unittest suite.
Raymond Hettinger <python@rcn.com>
parents:
27092
diff
changeset
|
206 771.3234287757674, -176.6150291498386, 12.50734324009056, |
|
e841c873a937
Move the statistical tests for four distributions into the unittest suite.
Raymond Hettinger <python@rcn.com>
parents:
27092
diff
changeset
|
207 -0.1385710331296526, 0.9934937113930748e-05, 0.1659470187408462e-06) |
|
e841c873a937
Move the statistical tests for four distributions into the unittest suite.
Raymond Hettinger <python@rcn.com>
parents:
27092
diff
changeset
|
208 |
|
e841c873a937
Move the statistical tests for four distributions into the unittest suite.
Raymond Hettinger <python@rcn.com>
parents:
27092
diff
changeset
|
209 def gamma(z, cof=_gammacoeff, g=7): |
|
e841c873a937
Move the statistical tests for four distributions into the unittest suite.
Raymond Hettinger <python@rcn.com>
parents:
27092
diff
changeset
|
210 z -= 1.0 |
|
e841c873a937
Move the statistical tests for four distributions into the unittest suite.
Raymond Hettinger <python@rcn.com>
parents:
27092
diff
changeset
|
211 sum = cof[0] |
|
e841c873a937
Move the statistical tests for four distributions into the unittest suite.
Raymond Hettinger <python@rcn.com>
parents:
27092
diff
changeset
|
212 for i in xrange(1,len(cof)): |
|
e841c873a937
Move the statistical tests for four distributions into the unittest suite.
Raymond Hettinger <python@rcn.com>
parents:
27092
diff
changeset
|
213 sum += cof[i] / (z+i) |
|
e841c873a937
Move the statistical tests for four distributions into the unittest suite.
Raymond Hettinger <python@rcn.com>
parents:
27092
diff
changeset
|
214 z += 0.5 |
|
e841c873a937
Move the statistical tests for four distributions into the unittest suite.
Raymond Hettinger <python@rcn.com>
parents:
27092
diff
changeset
|
215 return (z+g)**z / exp(z+g) * sqrt(2*pi) * sum |
|
e841c873a937
Move the statistical tests for four distributions into the unittest suite.
Raymond Hettinger <python@rcn.com>
parents:
27092
diff
changeset
|
216 |
| 27092 | 217 class TestDistributions(unittest.TestCase): |
| 218 def test_zeroinputs(self): | |
| 219 # Verify that distributions can handle a series of zero inputs' | |
| 220 g = random.Random() | |
| 221 x = [g.random() for i in xrange(50)] + [0.0]*5 | |
| 222 g.random = x[:].pop; g.uniform(1,10) | |
| 223 g.random = x[:].pop; g.paretovariate(1.0) | |
| 224 g.random = x[:].pop; g.expovariate(1.0) | |
| 225 g.random = x[:].pop; g.weibullvariate(1.0, 1.0) | |
| 226 g.random = x[:].pop; g.normalvariate(0.0, 1.0) | |
| 227 g.random = x[:].pop; g.gauss(0.0, 1.0) | |
| 228 g.random = x[:].pop; g.lognormvariate(0.0, 1.0) | |
| 229 g.random = x[:].pop; g.vonmisesvariate(0.0, 1.0) | |
| 230 g.random = x[:].pop; g.gammavariate(0.01, 1.0) | |
| 231 g.random = x[:].pop; g.gammavariate(1.0, 1.0) | |
| 232 g.random = x[:].pop; g.gammavariate(200.0, 1.0) | |
| 233 g.random = x[:].pop; g.betavariate(3.0, 3.0) | |
| 234 | |
|
27094
e841c873a937
Move the statistical tests for four distributions into the unittest suite.
Raymond Hettinger <python@rcn.com>
parents:
27092
diff
changeset
|
235 def test_avg_std(self): |
|
e841c873a937
Move the statistical tests for four distributions into the unittest suite.
Raymond Hettinger <python@rcn.com>
parents:
27092
diff
changeset
|
236 # Use integration to test distribution average and standard deviation. |
|
e841c873a937
Move the statistical tests for four distributions into the unittest suite.
Raymond Hettinger <python@rcn.com>
parents:
27092
diff
changeset
|
237 # Only works for distributions which do not consume variates in pairs |
|
e841c873a937
Move the statistical tests for four distributions into the unittest suite.
Raymond Hettinger <python@rcn.com>
parents:
27092
diff
changeset
|
238 g = random.Random() |
|
e841c873a937
Move the statistical tests for four distributions into the unittest suite.
Raymond Hettinger <python@rcn.com>
parents:
27092
diff
changeset
|
239 N = 5000 |
|
e841c873a937
Move the statistical tests for four distributions into the unittest suite.
Raymond Hettinger <python@rcn.com>
parents:
27092
diff
changeset
|
240 x = [i/float(N) for i in xrange(1,N)] |
|
e841c873a937
Move the statistical tests for four distributions into the unittest suite.
Raymond Hettinger <python@rcn.com>
parents:
27092
diff
changeset
|
241 for variate, args, mu, sigmasqrd in [ |
|
e841c873a937
Move the statistical tests for four distributions into the unittest suite.
Raymond Hettinger <python@rcn.com>
parents:
27092
diff
changeset
|
242 (g.uniform, (1.0,10.0), (10.0+1.0)/2, (10.0-1.0)**2/12), |
|
e841c873a937
Move the statistical tests for four distributions into the unittest suite.
Raymond Hettinger <python@rcn.com>
parents:
27092
diff
changeset
|
243 (g.expovariate, (1.5,), 1/1.5, 1/1.5**2), |
|
e841c873a937
Move the statistical tests for four distributions into the unittest suite.
Raymond Hettinger <python@rcn.com>
parents:
27092
diff
changeset
|
244 (g.paretovariate, (5.0,), 5.0/(5.0-1), |
|
e841c873a937
Move the statistical tests for four distributions into the unittest suite.
Raymond Hettinger <python@rcn.com>
parents:
27092
diff
changeset
|
245 5.0/((5.0-1)**2*(5.0-2))), |
|
e841c873a937
Move the statistical tests for four distributions into the unittest suite.
Raymond Hettinger <python@rcn.com>
parents:
27092
diff
changeset
|
246 (g.weibullvariate, (1.0, 3.0), gamma(1+1/3.0), |
|
e841c873a937
Move the statistical tests for four distributions into the unittest suite.
Raymond Hettinger <python@rcn.com>
parents:
27092
diff
changeset
|
247 gamma(1+2/3.0)-gamma(1+1/3.0)**2) ]: |
|
e841c873a937
Move the statistical tests for four distributions into the unittest suite.
Raymond Hettinger <python@rcn.com>
parents:
27092
diff
changeset
|
248 g.random = x[:].pop |
|
e841c873a937
Move the statistical tests for four distributions into the unittest suite.
Raymond Hettinger <python@rcn.com>
parents:
27092
diff
changeset
|
249 y = [] |
|
e841c873a937
Move the statistical tests for four distributions into the unittest suite.
Raymond Hettinger <python@rcn.com>
parents:
27092
diff
changeset
|
250 for i in xrange(len(x)): |
|
e841c873a937
Move the statistical tests for four distributions into the unittest suite.
Raymond Hettinger <python@rcn.com>
parents:
27092
diff
changeset
|
251 try: |
|
e841c873a937
Move the statistical tests for four distributions into the unittest suite.
Raymond Hettinger <python@rcn.com>
parents:
27092
diff
changeset
|
252 y.append(variate(*args)) |
|
e841c873a937
Move the statistical tests for four distributions into the unittest suite.
Raymond Hettinger <python@rcn.com>
parents:
27092
diff
changeset
|
253 except IndexError: |
|
e841c873a937
Move the statistical tests for four distributions into the unittest suite.
Raymond Hettinger <python@rcn.com>
parents:
27092
diff
changeset
|
254 pass |
|
e841c873a937
Move the statistical tests for four distributions into the unittest suite.
Raymond Hettinger <python@rcn.com>
parents:
27092
diff
changeset
|
255 s1 = s2 = 0 |
|
e841c873a937
Move the statistical tests for four distributions into the unittest suite.
Raymond Hettinger <python@rcn.com>
parents:
27092
diff
changeset
|
256 for e in y: |
|
e841c873a937
Move the statistical tests for four distributions into the unittest suite.
Raymond Hettinger <python@rcn.com>
parents:
27092
diff
changeset
|
257 s1 += e |
|
e841c873a937
Move the statistical tests for four distributions into the unittest suite.
Raymond Hettinger <python@rcn.com>
parents:
27092
diff
changeset
|
258 s2 += (e - mu) ** 2 |
|
e841c873a937
Move the statistical tests for four distributions into the unittest suite.
Raymond Hettinger <python@rcn.com>
parents:
27092
diff
changeset
|
259 N = len(y) |
|
e841c873a937
Move the statistical tests for four distributions into the unittest suite.
Raymond Hettinger <python@rcn.com>
parents:
27092
diff
changeset
|
260 self.assertAlmostEqual(s1/N, mu, 2) |
|
e841c873a937
Move the statistical tests for four distributions into the unittest suite.
Raymond Hettinger <python@rcn.com>
parents:
27092
diff
changeset
|
261 self.assertAlmostEqual(s2/(N-1), sigmasqrd, 2) |
|
e841c873a937
Move the statistical tests for four distributions into the unittest suite.
Raymond Hettinger <python@rcn.com>
parents:
27092
diff
changeset
|
262 |
|
26829
f64c96922708
SF patch 658251: Install a C implementation of the Mersenne Twister as the
Raymond Hettinger <python@rcn.com>
parents:
24364
diff
changeset
|
263 class TestModule(unittest.TestCase): |
|
f64c96922708
SF patch 658251: Install a C implementation of the Mersenne Twister as the
Raymond Hettinger <python@rcn.com>
parents:
24364
diff
changeset
|
264 def testMagicConstants(self): |
|
f64c96922708
SF patch 658251: Install a C implementation of the Mersenne Twister as the
Raymond Hettinger <python@rcn.com>
parents:
24364
diff
changeset
|
265 self.assertAlmostEqual(random.NV_MAGICCONST, 1.71552776992141) |
|
f64c96922708
SF patch 658251: Install a C implementation of the Mersenne Twister as the
Raymond Hettinger <python@rcn.com>
parents:
24364
diff
changeset
|
266 self.assertAlmostEqual(random.TWOPI, 6.28318530718) |
|
f64c96922708
SF patch 658251: Install a C implementation of the Mersenne Twister as the
Raymond Hettinger <python@rcn.com>
parents:
24364
diff
changeset
|
267 self.assertAlmostEqual(random.LOG4, 1.38629436111989) |
|
f64c96922708
SF patch 658251: Install a C implementation of the Mersenne Twister as the
Raymond Hettinger <python@rcn.com>
parents:
24364
diff
changeset
|
268 self.assertAlmostEqual(random.SG_MAGICCONST, 2.50407739677627) |
|
f64c96922708
SF patch 658251: Install a C implementation of the Mersenne Twister as the
Raymond Hettinger <python@rcn.com>
parents:
24364
diff
changeset
|
269 |
|
f64c96922708
SF patch 658251: Install a C implementation of the Mersenne Twister as the
Raymond Hettinger <python@rcn.com>
parents:
24364
diff
changeset
|
270 def test__all__(self): |
|
f64c96922708
SF patch 658251: Install a C implementation of the Mersenne Twister as the
Raymond Hettinger <python@rcn.com>
parents:
24364
diff
changeset
|
271 # tests validity but not completeness of the __all__ list |
|
27279
9de064c7a247
* Migrate sample distribution test from random.py to test_random.py.
Raymond Hettinger <python@rcn.com>
parents:
27094
diff
changeset
|
272 self.failUnless(Set(random.__all__) <= Set(dir(random))) |
|
26829
f64c96922708
SF patch 658251: Install a C implementation of the Mersenne Twister as the
Raymond Hettinger <python@rcn.com>
parents:
24364
diff
changeset
|
273 |
| 27668 | 274 def test_main(verbose=None): |
|
26829
f64c96922708
SF patch 658251: Install a C implementation of the Mersenne Twister as the
Raymond Hettinger <python@rcn.com>
parents:
24364
diff
changeset
|
275 suite = unittest.TestSuite() |
|
f64c96922708
SF patch 658251: Install a C implementation of the Mersenne Twister as the
Raymond Hettinger <python@rcn.com>
parents:
24364
diff
changeset
|
276 for testclass in (WichmannHill_TestBasicOps, |
|
f64c96922708
SF patch 658251: Install a C implementation of the Mersenne Twister as the
Raymond Hettinger <python@rcn.com>
parents:
24364
diff
changeset
|
277 MersenneTwister_TestBasicOps, |
| 27092 | 278 TestDistributions, |
|
26829
f64c96922708
SF patch 658251: Install a C implementation of the Mersenne Twister as the
Raymond Hettinger <python@rcn.com>
parents:
24364
diff
changeset
|
279 TestModule): |
|
f64c96922708
SF patch 658251: Install a C implementation of the Mersenne Twister as the
Raymond Hettinger <python@rcn.com>
parents:
24364
diff
changeset
|
280 suite.addTest(unittest.makeSuite(testclass)) |
|
f64c96922708
SF patch 658251: Install a C implementation of the Mersenne Twister as the
Raymond Hettinger <python@rcn.com>
parents:
24364
diff
changeset
|
281 test_support.run_suite(suite) |
|
f64c96922708
SF patch 658251: Install a C implementation of the Mersenne Twister as the
Raymond Hettinger <python@rcn.com>
parents:
24364
diff
changeset
|
282 |
| 27668 | 283 # verify reference counting |
| 284 import sys | |
| 285 if verbose and hasattr(sys, "gettotalrefcount"): | |
| 286 counts = [] | |
| 287 for i in xrange(5): | |
| 288 test_support.run_suite(suite) | |
| 289 counts.append(sys.gettotalrefcount()-i) | |
| 290 print counts | |
| 291 | |
|
26829
f64c96922708
SF patch 658251: Install a C implementation of the Mersenne Twister as the
Raymond Hettinger <python@rcn.com>
parents:
24364
diff
changeset
|
292 if __name__ == "__main__": |
| 27668 | 293 test_main(verbose=True) |
