SHOW:
|
|
- or go back to the newest paste.
1 | /* | |
2 | * Lightweight adaptation of the example multiply with carry PRNG | |
3 | * code from wikipedia | |
4 | - | * Version: 1 |
4 | + | * Version: 2 |
5 | */ | |
6 | ||
7 | #include <stdint.h> | |
8 | ||
9 | - | #define PHI 0x9e3779b9 |
9 | + | #define MWC_A 18782LL |
10 | #define MWC_R 0xfffffffe | |
11 | ||
12 | static uint32_t Q, c = 362436; | |
13 | ||
14 | void init_rand(uint32_t x) | |
15 | { Q = x; | |
16 | } | |
17 | ||
18 | - | { uint64_t t, a = 18782LL; |
18 | + | |
19 | - | uint32_t x, r = 0xfffffffe; |
19 | + | { uint32_t x; |
20 | - | t = a * Q + c; |
20 | + | uint64_t t = MWC_A * Q + c; |
21 | c = (t >> 32); | |
22 | x = t + c; | |
23 | if(x < c) | |
24 | { x++; | |
25 | c++; | |
26 | } | |
27 | - | return (Q = r - x); |
27 | + | return (Q = MWC_R - x); |
28 | } |