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 Colombiernfastrand(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