1 /* Random objects */
2 
3 /* ------------------------------------------------------------------
4    The code in this module was based on a download from:
5       http://www.math.sci.hiroshima-u.ac.jp/~m-mat/MT/MT2002/emt19937ar.html
6 
7    It was modified in 2002 by Raymond Hettinger as follows:
8 
9     * the principal computational lines untouched.
10 
11     * renamed genrand_res53() to random_random() and wrapped
12       in python calling/return code.
13 
14     * genrand_uint32() and the helper functions, init_genrand()
15       and init_by_array(), were declared static, wrapped in
16       Python calling/return code.  also, their global data
17       references were replaced with structure references.
18 
19     * unused functions from the original were deleted.
20       new, original C python code was added to implement the
21       Random() interface.
22 
23    The following are the verbatim comments from the original code:
24 
25    A C-program for MT19937, with initialization improved 2002/1/26.
26    Coded by Takuji Nishimura and Makoto Matsumoto.
27 
28    Before using, initialize the state by using init_genrand(seed)
29    or init_by_array(init_key, key_length).
30 
31    Copyright (C) 1997 - 2002, Makoto Matsumoto and Takuji Nishimura,
32    All rights reserved.
33 
34    Redistribution and use in source and binary forms, with or without
35    modification, are permitted provided that the following conditions
36    are met:
37 
38      1. Redistributions of source code must retain the above copyright
39     notice, this list of conditions and the following disclaimer.
40 
41      2. Redistributions in binary form must reproduce the above copyright
42     notice, this list of conditions and the following disclaimer in the
43     documentation and/or other materials provided with the distribution.
44 
45      3. The names of its contributors may not be used to endorse or promote
46     products derived from this software without specific prior written
47     permission.
48 
49    THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
50    "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
51    LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
52    A PARTICULAR PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR
53    CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
54    EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
55    PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
56    PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
57    LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
58    NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
59    SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
60 
61 
62    Any feedback is very welcome.
63    http://www.math.sci.hiroshima-u.ac.jp/~m-mat/MT/emt.html
64    email: m-mat @ math.sci.hiroshima-u.ac.jp (remove space)
65 */
66 
67 /* ---------------------------------------------------------------*/
68 
69 #ifndef Py_BUILD_CORE_BUILTIN
70 #  define Py_BUILD_CORE_MODULE 1
71 #endif
72 
73 #include "Python.h"
74 #include "pycore_moduleobject.h"  // _PyModule_GetState()
75 #ifdef HAVE_PROCESS_H
76 #  include <process.h>            // getpid()
77 #endif
78 
79 /* Period parameters -- These are all magic.  Don't change. */
80 #define N 624
81 #define M 397
82 #define MATRIX_A 0x9908b0dfU    /* constant vector a */
83 #define UPPER_MASK 0x80000000U  /* most significant w-r bits */
84 #define LOWER_MASK 0x7fffffffU  /* least significant r bits */
85 
86 typedef struct {
87     PyObject *Random_Type;
88     PyObject *Long___abs__;
89 } _randomstate;
90 
91 static inline _randomstate*
get_random_state(PyObject * module)92 get_random_state(PyObject *module)
93 {
94     void *state = _PyModule_GetState(module);
95     assert(state != NULL);
96     return (_randomstate *)state;
97 }
98 
99 static struct PyModuleDef _randommodule;
100 
101 #define _randomstate_type(type) \
102     (get_random_state(PyType_GetModuleByDef(type, &_randommodule)))
103 
104 typedef struct {
105     PyObject_HEAD
106     int index;
107     uint32_t state[N];
108 } RandomObject;
109 
110 
111 #include "clinic/_randommodule.c.h"
112 
113 /*[clinic input]
114 module _random
115 class _random.Random "RandomObject *" "_randomstate_type(type)->Random_Type"
116 [clinic start generated code]*/
117 /*[clinic end generated code: output=da39a3ee5e6b4b0d input=70a2c99619474983]*/
118 
119 /* Random methods */
120 
121 
122 /* generates a random number on [0,0xffffffff]-interval */
123 static uint32_t
genrand_uint32(RandomObject * self)124 genrand_uint32(RandomObject *self)
125 {
126     uint32_t y;
127     static const uint32_t mag01[2] = {0x0U, MATRIX_A};
128     /* mag01[x] = x * MATRIX_A  for x=0,1 */
129     uint32_t *mt;
130 
131     mt = self->state;
132     if (self->index >= N) { /* generate N words at one time */
133         int kk;
134 
135         for (kk=0;kk<N-M;kk++) {
136             y = (mt[kk]&UPPER_MASK)|(mt[kk+1]&LOWER_MASK);
137             mt[kk] = mt[kk+M] ^ (y >> 1) ^ mag01[y & 0x1U];
138         }
139         for (;kk<N-1;kk++) {
140             y = (mt[kk]&UPPER_MASK)|(mt[kk+1]&LOWER_MASK);
141             mt[kk] = mt[kk+(M-N)] ^ (y >> 1) ^ mag01[y & 0x1U];
142         }
143         y = (mt[N-1]&UPPER_MASK)|(mt[0]&LOWER_MASK);
144         mt[N-1] = mt[M-1] ^ (y >> 1) ^ mag01[y & 0x1U];
145 
146         self->index = 0;
147     }
148 
149     y = mt[self->index++];
150     y ^= (y >> 11);
151     y ^= (y << 7) & 0x9d2c5680U;
152     y ^= (y << 15) & 0xefc60000U;
153     y ^= (y >> 18);
154     return y;
155 }
156 
157 /* random_random is the function named genrand_res53 in the original code;
158  * generates a random number on [0,1) with 53-bit resolution; note that
159  * 9007199254740992 == 2**53; I assume they're spelling "/2**53" as
160  * multiply-by-reciprocal in the (likely vain) hope that the compiler will
161  * optimize the division away at compile-time.  67108864 is 2**26.  In
162  * effect, a contains 27 random bits shifted left 26, and b fills in the
163  * lower 26 bits of the 53-bit numerator.
164  * The original code credited Isaku Wada for this algorithm, 2002/01/09.
165  */
166 
167 /*[clinic input]
168 _random.Random.random
169 
170   self: self(type="RandomObject *")
171 
172 random() -> x in the interval [0, 1).
173 [clinic start generated code]*/
174 
175 static PyObject *
_random_Random_random_impl(RandomObject * self)176 _random_Random_random_impl(RandomObject *self)
177 /*[clinic end generated code: output=117ff99ee53d755c input=afb2a59cbbb00349]*/
178 {
179     uint32_t a=genrand_uint32(self)>>5, b=genrand_uint32(self)>>6;
180     return PyFloat_FromDouble((a*67108864.0+b)*(1.0/9007199254740992.0));
181 }
182 
183 /* initializes mt[N] with a seed */
184 static void
init_genrand(RandomObject * self,uint32_t s)185 init_genrand(RandomObject *self, uint32_t s)
186 {
187     int mti;
188     uint32_t *mt;
189 
190     mt = self->state;
191     mt[0]= s;
192     for (mti=1; mti<N; mti++) {
193         mt[mti] =
194         (1812433253U * (mt[mti-1] ^ (mt[mti-1] >> 30)) + mti);
195         /* See Knuth TAOCP Vol2. 3rd Ed. P.106 for multiplier. */
196         /* In the previous versions, MSBs of the seed affect   */
197         /* only MSBs of the array mt[].                                */
198         /* 2002/01/09 modified by Makoto Matsumoto                     */
199     }
200     self->index = mti;
201     return;
202 }
203 
204 /* initialize by an array with array-length */
205 /* init_key is the array for initializing keys */
206 /* key_length is its length */
207 static void
init_by_array(RandomObject * self,uint32_t init_key[],size_t key_length)208 init_by_array(RandomObject *self, uint32_t init_key[], size_t key_length)
209 {
210     size_t i, j, k;       /* was signed in the original code. RDH 12/16/2002 */
211     uint32_t *mt;
212 
213     mt = self->state;
214     init_genrand(self, 19650218U);
215     i=1; j=0;
216     k = (N>key_length ? N : key_length);
217     for (; k; k--) {
218         mt[i] = (mt[i] ^ ((mt[i-1] ^ (mt[i-1] >> 30)) * 1664525U))
219                  + init_key[j] + (uint32_t)j; /* non linear */
220         i++; j++;
221         if (i>=N) { mt[0] = mt[N-1]; i=1; }
222         if (j>=key_length) j=0;
223     }
224     for (k=N-1; k; k--) {
225         mt[i] = (mt[i] ^ ((mt[i-1] ^ (mt[i-1] >> 30)) * 1566083941U))
226                  - (uint32_t)i; /* non linear */
227         i++;
228         if (i>=N) { mt[0] = mt[N-1]; i=1; }
229     }
230 
231     mt[0] = 0x80000000U; /* MSB is 1; assuring non-zero initial array */
232 }
233 
234 /*
235  * The rest is Python-specific code, neither part of, nor derived from, the
236  * Twister download.
237  */
238 
239 static int
random_seed_urandom(RandomObject * self)240 random_seed_urandom(RandomObject *self)
241 {
242     uint32_t key[N];
243 
244     if (_PyOS_URandomNonblock(key, sizeof(key)) < 0) {
245         return -1;
246     }
247     init_by_array(self, key, Py_ARRAY_LENGTH(key));
248     return 0;
249 }
250 
251 static void
random_seed_time_pid(RandomObject * self)252 random_seed_time_pid(RandomObject *self)
253 {
254     _PyTime_t now;
255     uint32_t key[5];
256 
257     now = _PyTime_GetSystemClock();
258     key[0] = (uint32_t)(now & 0xffffffffU);
259     key[1] = (uint32_t)(now >> 32);
260 
261 #ifdef HAVE_GETPID
262     key[2] = (uint32_t)getpid();
263 #else
264     key[2] = 0;
265 #endif
266 
267     now = _PyTime_GetMonotonicClock();
268     key[3] = (uint32_t)(now & 0xffffffffU);
269     key[4] = (uint32_t)(now >> 32);
270 
271     init_by_array(self, key, Py_ARRAY_LENGTH(key));
272 }
273 
274 static int
random_seed(RandomObject * self,PyObject * arg)275 random_seed(RandomObject *self, PyObject *arg)
276 {
277     int result = -1;  /* guilty until proved innocent */
278     PyObject *n = NULL;
279     uint32_t *key = NULL;
280     size_t bits, keyused;
281     int res;
282 
283     if (arg == NULL || arg == Py_None) {
284        if (random_seed_urandom(self) < 0) {
285             PyErr_Clear();
286 
287             /* Reading system entropy failed, fall back on the worst entropy:
288                use the current time and process identifier. */
289             random_seed_time_pid(self);
290         }
291         return 0;
292     }
293 
294     /* This algorithm relies on the number being unsigned.
295      * So: if the arg is a PyLong, use its absolute value.
296      * Otherwise use its hash value, cast to unsigned.
297      */
298     if (PyLong_CheckExact(arg)) {
299         n = PyNumber_Absolute(arg);
300     } else if (PyLong_Check(arg)) {
301         /* Calling int.__abs__() prevents calling arg.__abs__(), which might
302            return an invalid value. See issue #31478. */
303         _randomstate *state = _randomstate_type(Py_TYPE(self));
304         n = PyObject_CallOneArg(state->Long___abs__, arg);
305     }
306     else {
307         Py_hash_t hash = PyObject_Hash(arg);
308         if (hash == -1)
309             goto Done;
310         n = PyLong_FromSize_t((size_t)hash);
311     }
312     if (n == NULL)
313         goto Done;
314 
315     /* Now split n into 32-bit chunks, from the right. */
316     bits = _PyLong_NumBits(n);
317     if (bits == (size_t)-1 && PyErr_Occurred())
318         goto Done;
319 
320     /* Figure out how many 32-bit chunks this gives us. */
321     keyused = bits == 0 ? 1 : (bits - 1) / 32 + 1;
322 
323     /* Convert seed to byte sequence. */
324     key = (uint32_t *)PyMem_Malloc((size_t)4 * keyused);
325     if (key == NULL) {
326         PyErr_NoMemory();
327         goto Done;
328     }
329     res = _PyLong_AsByteArray((PyLongObject *)n,
330                               (unsigned char *)key, keyused * 4,
331                               PY_LITTLE_ENDIAN,
332                               0); /* unsigned */
333     if (res == -1) {
334         goto Done;
335     }
336 
337 #if PY_BIG_ENDIAN
338     {
339         size_t i, j;
340         /* Reverse an array. */
341         for (i = 0, j = keyused - 1; i < j; i++, j--) {
342             uint32_t tmp = key[i];
343             key[i] = key[j];
344             key[j] = tmp;
345         }
346     }
347 #endif
348     init_by_array(self, key, keyused);
349 
350     result = 0;
351 
352 Done:
353     Py_XDECREF(n);
354     PyMem_Free(key);
355     return result;
356 }
357 
358 /*[clinic input]
359 _random.Random.seed
360 
361   self: self(type="RandomObject *")
362   n: object = None
363   /
364 
365 seed([n]) -> None.
366 
367 Defaults to use urandom and falls back to a combination
368 of the current time and the process identifier.
369 [clinic start generated code]*/
370 
371 static PyObject *
_random_Random_seed_impl(RandomObject * self,PyObject * n)372 _random_Random_seed_impl(RandomObject *self, PyObject *n)
373 /*[clinic end generated code: output=0fad1e16ba883681 input=78d6ef0d52532a54]*/
374 {
375     if (random_seed(self, n) < 0) {
376         return NULL;
377     }
378     Py_RETURN_NONE;
379 }
380 
381 /*[clinic input]
382 _random.Random.getstate
383 
384   self: self(type="RandomObject *")
385 
386 getstate() -> tuple containing the current state.
387 [clinic start generated code]*/
388 
389 static PyObject *
_random_Random_getstate_impl(RandomObject * self)390 _random_Random_getstate_impl(RandomObject *self)
391 /*[clinic end generated code: output=bf6cef0c092c7180 input=b937a487928c0e89]*/
392 {
393     PyObject *state;
394     PyObject *element;
395     int i;
396 
397     state = PyTuple_New(N+1);
398     if (state == NULL)
399         return NULL;
400     for (i=0; i<N ; i++) {
401         element = PyLong_FromUnsignedLong(self->state[i]);
402         if (element == NULL)
403             goto Fail;
404         PyTuple_SET_ITEM(state, i, element);
405     }
406     element = PyLong_FromLong((long)(self->index));
407     if (element == NULL)
408         goto Fail;
409     PyTuple_SET_ITEM(state, i, element);
410     return state;
411 
412 Fail:
413     Py_DECREF(state);
414     return NULL;
415 }
416 
417 
418 /*[clinic input]
419 _random.Random.setstate
420 
421   self: self(type="RandomObject *")
422   state: object
423   /
424 
425 setstate(state) -> None.  Restores generator state.
426 [clinic start generated code]*/
427 
428 static PyObject *
_random_Random_setstate(RandomObject * self,PyObject * state)429 _random_Random_setstate(RandomObject *self, PyObject *state)
430 /*[clinic end generated code: output=fd1c3cd0037b6681 input=b3b4efbb1bc66af8]*/
431 {
432     int i;
433     unsigned long element;
434     long index;
435     uint32_t new_state[N];
436 
437     if (!PyTuple_Check(state)) {
438         PyErr_SetString(PyExc_TypeError,
439             "state vector must be a tuple");
440         return NULL;
441     }
442     if (PyTuple_Size(state) != N+1) {
443         PyErr_SetString(PyExc_ValueError,
444             "state vector is the wrong size");
445         return NULL;
446     }
447 
448     for (i=0; i<N ; i++) {
449         element = PyLong_AsUnsignedLong(PyTuple_GET_ITEM(state, i));
450         if (element == (unsigned long)-1 && PyErr_Occurred())
451             return NULL;
452         new_state[i] = (uint32_t)element;
453     }
454 
455     index = PyLong_AsLong(PyTuple_GET_ITEM(state, i));
456     if (index == -1 && PyErr_Occurred())
457         return NULL;
458     if (index < 0 || index > N) {
459         PyErr_SetString(PyExc_ValueError, "invalid state");
460         return NULL;
461     }
462     self->index = (int)index;
463     for (i = 0; i < N; i++)
464         self->state[i] = new_state[i];
465 
466     Py_RETURN_NONE;
467 }
468 
469 /*[clinic input]
470 
471 _random.Random.getrandbits
472 
473   self: self(type="RandomObject *")
474   k: int
475   /
476 
477 getrandbits(k) -> x.  Generates an int with k random bits.
478 [clinic start generated code]*/
479 
480 static PyObject *
_random_Random_getrandbits_impl(RandomObject * self,int k)481 _random_Random_getrandbits_impl(RandomObject *self, int k)
482 /*[clinic end generated code: output=b402f82a2158887f input=8c0e6396dd176fc0]*/
483 {
484     int i, words;
485     uint32_t r;
486     uint32_t *wordarray;
487     PyObject *result;
488 
489     if (k < 0) {
490         PyErr_SetString(PyExc_ValueError,
491                         "number of bits must be non-negative");
492         return NULL;
493     }
494 
495     if (k == 0)
496         return PyLong_FromLong(0);
497 
498     if (k <= 32)  /* Fast path */
499         return PyLong_FromUnsignedLong(genrand_uint32(self) >> (32 - k));
500 
501     words = (k - 1) / 32 + 1;
502     wordarray = (uint32_t *)PyMem_Malloc(words * 4);
503     if (wordarray == NULL) {
504         PyErr_NoMemory();
505         return NULL;
506     }
507 
508     /* Fill-out bits of long integer, by 32-bit words, from least significant
509        to most significant. */
510 #if PY_LITTLE_ENDIAN
511     for (i = 0; i < words; i++, k -= 32)
512 #else
513     for (i = words - 1; i >= 0; i--, k -= 32)
514 #endif
515     {
516         r = genrand_uint32(self);
517         if (k < 32)
518             r >>= (32 - k);  /* Drop least significant bits */
519         wordarray[i] = r;
520     }
521 
522     result = _PyLong_FromByteArray((unsigned char *)wordarray, words * 4,
523                                    PY_LITTLE_ENDIAN, 0 /* unsigned */);
524     PyMem_Free(wordarray);
525     return result;
526 }
527 
528 static int
random_init(RandomObject * self,PyObject * args,PyObject * kwds)529 random_init(RandomObject *self, PyObject *args, PyObject *kwds)
530 {
531     PyObject *arg = NULL;
532     _randomstate *state = _randomstate_type(Py_TYPE(self));
533 
534     if ((Py_IS_TYPE(self, (PyTypeObject *)state->Random_Type) ||
535          Py_TYPE(self)->tp_init == ((PyTypeObject*)state->Random_Type)->tp_init) &&
536         !_PyArg_NoKeywords("Random", kwds)) {
537         return -1;
538     }
539 
540     if (PyTuple_GET_SIZE(args) > 1) {
541         PyErr_SetString(PyExc_TypeError, "Random() requires 0 or 1 argument");
542         return -1;
543     }
544 
545     if (PyTuple_GET_SIZE(args) == 1)
546         arg = PyTuple_GET_ITEM(args, 0);
547 
548     return random_seed(self, arg);
549 }
550 
551 
552 static PyMethodDef random_methods[] = {
553     _RANDOM_RANDOM_RANDOM_METHODDEF
554     _RANDOM_RANDOM_SEED_METHODDEF
555     _RANDOM_RANDOM_GETSTATE_METHODDEF
556     _RANDOM_RANDOM_SETSTATE_METHODDEF
557     _RANDOM_RANDOM_GETRANDBITS_METHODDEF
558     {NULL,              NULL}           /* sentinel */
559 };
560 
561 PyDoc_STRVAR(random_doc,
562 "Random() -> create a random number generator with its own internal state.");
563 
564 static PyType_Slot Random_Type_slots[] = {
565     {Py_tp_doc, (void *)random_doc},
566     {Py_tp_methods, random_methods},
567     {Py_tp_new, PyType_GenericNew},
568     {Py_tp_init, random_init},
569     {Py_tp_free, PyObject_Free},
570     {0, 0},
571 };
572 
573 static PyType_Spec Random_Type_spec = {
574     "_random.Random",
575     sizeof(RandomObject),
576     0,
577     Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE,
578     Random_Type_slots
579 };
580 
581 PyDoc_STRVAR(module_doc,
582 "Module implements the Mersenne Twister random number generator.");
583 
584 static int
_random_exec(PyObject * module)585 _random_exec(PyObject *module)
586 {
587     _randomstate *state = get_random_state(module);
588 
589     state->Random_Type = PyType_FromModuleAndSpec(
590         module, &Random_Type_spec, NULL);
591     if (state->Random_Type == NULL) {
592         return -1;
593     }
594     if (PyModule_AddType(module, (PyTypeObject *)state->Random_Type) < 0) {
595         return -1;
596     }
597 
598     /* Look up and save int.__abs__, which is needed in random_seed(). */
599     PyObject *longval = PyLong_FromLong(0);
600     if (longval == NULL) {
601         return -1;
602     }
603 
604     PyObject *longtype = PyObject_Type(longval);
605     Py_DECREF(longval);
606     if (longtype == NULL) {
607         return -1;
608     }
609 
610     state->Long___abs__ = PyObject_GetAttrString(longtype, "__abs__");
611     Py_DECREF(longtype);
612     if (state->Long___abs__ == NULL) {
613         return -1;
614     }
615     return 0;
616 }
617 
618 static PyModuleDef_Slot _random_slots[] = {
619     {Py_mod_exec, _random_exec},
620     {0, NULL}
621 };
622 
623 static int
_random_traverse(PyObject * module,visitproc visit,void * arg)624 _random_traverse(PyObject *module, visitproc visit, void *arg)
625 {
626     Py_VISIT(get_random_state(module)->Random_Type);
627     return 0;
628 }
629 
630 static int
_random_clear(PyObject * module)631 _random_clear(PyObject *module)
632 {
633     Py_CLEAR(get_random_state(module)->Random_Type);
634     Py_CLEAR(get_random_state(module)->Long___abs__);
635     return 0;
636 }
637 
638 static void
_random_free(void * module)639 _random_free(void *module)
640 {
641     _random_clear((PyObject *)module);
642 }
643 
644 static struct PyModuleDef _randommodule = {
645     PyModuleDef_HEAD_INIT,
646     "_random",
647     module_doc,
648     sizeof(_randomstate),
649     NULL,
650     _random_slots,
651     _random_traverse,
652     _random_clear,
653     _random_free,
654 };
655 
656 PyMODINIT_FUNC
PyInit__random(void)657 PyInit__random(void)
658 {
659     return PyModuleDef_Init(&_randommodule);
660 }
661