1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
|
=======
SyncRNG
=======
A synchronized Tausworthe RNG usable in R and Python.
Why?
====
This program was created because it was desired to have the same random
numbers in both R and Python programs. Although both languages implement a
Mersenne-Twister RNG, the implementations are so different that it is not
possible to get the same random numbers with the same seed.
SyncRNG is a Tausworthe RNG implemented in ``syncrng.c``, and linked to both R
and Python. Since both use the same underlying C code, the random numbers will
be the same in both languages, provided the same seed is used.
You can read more about my motivations for creating this `here
<https://gertjanvandenburg.com/blog/syncrng/>`_.
How
===
First install the packages as stated under Installation. Then, in Python you
can do::
from SyncRNG import SyncRNG
s = SyncRNG(seed=123456)
for i in range(10):
print(s.randi())
Similarly, after installing the R library you can do in R::
library(SyncRNG)
s <- SyncRNG(seed=123456)
for (i in 1:10) {
cat(s$randi(), '\n')
}
You'll notice that the random numbers are indeed the same.
R - User defined RNG
--------------------
R allows the user to define a custom random number generator, which is then
used for the common ``runif`` and ``rnorm`` functions in R. This has also been
implemented in SyncRNG as of version 1.3.0. To enable this, run::
library(SyncRNG)
set.seed(123456, 'user', 'user')
runif(10)
These numbers are between [0, 1) and multiplying by ``2**32 - 1`` gives the
same results as above.
Installation
============
Installing the R package can be done through CRAN::
install.packages('SyncRNG')
The Python package can be installed using pip::
pip install syncrng
Usage
=====
In both R and Python the following methods are available for the ``SyncRNG``
class:
1. ``randi()``: generate a random integer on the interval [0, 2^32).
2. ``rand()``: generate a random floating point number on the interval [0.0,
1.0)
3. ``randbelow(n)``: generate a random integer below a given integer ``n``.
4. ``shuffle(x)``: generate a permutation of a given list of numbers ``x``.
Notes
=====
The random numbers are uniformly distributed on ``[0, 2^32 - 1]``.
Questions and Issues
====================
If you have questions about SyncRNG or you encounter a problem, please open an
`issue on GitHub <https://github.com/GjjvdBurg/SyncRNG/>`_.
|