xref: /plan9/sys/src/ape/lib/v/nrand.c (revision 3e12c5d1bb89fc02707907988834ef147769ddaf)
1*3e12c5d1SDavid du Colombier #include <stdlib.h>
2*3e12c5d1SDavid du Colombier 
3*3e12c5d1SDavid du Colombier #define	MASK	0x7FFFFFFFL
4*3e12c5d1SDavid du Colombier #define	FRACT	(1.0 / (MASK + 1.0))
5*3e12c5d1SDavid du Colombier 
6*3e12c5d1SDavid du Colombier extern long lrand(void);
7*3e12c5d1SDavid du Colombier 
8*3e12c5d1SDavid du Colombier double
frand(void)9*3e12c5d1SDavid du Colombier frand(void)
10*3e12c5d1SDavid du Colombier {
11*3e12c5d1SDavid du Colombier 
12*3e12c5d1SDavid du Colombier 	return lrand() * FRACT;
13*3e12c5d1SDavid du Colombier }
14*3e12c5d1SDavid du Colombier 
nrand(int n)15*3e12c5d1SDavid du Colombier nrand(int n)
16*3e12c5d1SDavid du Colombier {
17*3e12c5d1SDavid du Colombier 	long slop, v;
18*3e12c5d1SDavid du Colombier 
19*3e12c5d1SDavid du Colombier 	slop = MASK % n;
20*3e12c5d1SDavid du Colombier 	do
21*3e12c5d1SDavid du Colombier 		v = lrand();
22*3e12c5d1SDavid du Colombier 	while(v <= slop);
23*3e12c5d1SDavid du Colombier 	return v % n;
24*3e12c5d1SDavid du Colombier }
25