summaryrefslogtreecommitdiffstats
path: root/mdk-stage1/dietlibc/lib/rand_r.c
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;
}