xref: /plan9/sys/src/libsec/port/nfastrand.c (revision 39734e7ed1eb944f5e7b41936007d0d38b560d7f)
1d9306527SDavid du Colombier #include <u.h>
2d9306527SDavid du Colombier #include <libc.h>
3d9306527SDavid du Colombier #include <libsec.h>
4d9306527SDavid du Colombier 
5d9306527SDavid du Colombier #define Maxrand	((1UL<<31)-1)
6d9306527SDavid du Colombier 
7d9306527SDavid du Colombier ulong
nfastrand(ulong n)8d9306527SDavid du Colombier nfastrand(ulong n)
9d9306527SDavid du Colombier {
10d9306527SDavid du Colombier 	ulong m, r;
11d9306527SDavid du Colombier 
12d9306527SDavid du Colombier 	/*
13d9306527SDavid du Colombier 	 * set m to the maximum multiple of n <= 2^31-1
14d9306527SDavid du Colombier 	 * so we want a random number < m.
15d9306527SDavid du Colombier 	 */
16d9306527SDavid du Colombier 	if(n > Maxrand)
17*39734e7eSDavid du Colombier 		sysfatal("nfastrand: n too large");
18d9306527SDavid du Colombier 
19d9306527SDavid du Colombier 	m = Maxrand - Maxrand % n;
20d9306527SDavid du Colombier 	while((r = fastrand()) >= m)
21d9306527SDavid du Colombier 		;
22d9306527SDavid du Colombier 	return r%n;
23d9306527SDavid du Colombier }
24