aboutsummaryrefslogtreecommitdiff
path: root/README.md
blob: 08afc28980ab9c5b31ce6a1a6d61cb810a3acaef (plain)
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
=======
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.

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.

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]``.