blob: 55f8303bca4394d4a01bee909671da215235036c (
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
|
/*
Copyright (C) 2002 Luc Van Oostenryck
This is free software. You can redistribute and
modify it under the terms of the GNU General Public
Public License.
*/
#include <stdlib.h>
#include <stdint.h>
/* Knuth's TAOCP section 3.6 */
#define M ((1U<<31) -1)
#define A 48271
#define Q 44488 // M/A
#define R 3399 // M%A; R < Q !!!
// FIXME: ISO C/SuS want a longer period
int rand_r(unsigned int* seed)
{ int32_t X;
X = *seed;
X = A*(X%Q) - R * (int32_t) (X/Q);
if (X < 0)
X += M;
*seed = X;
return X;
}
|