1*8ccd4a63SDavid du Colombier #include <u.h> 2*8ccd4a63SDavid du Colombier #include <libc.h> 3*8ccd4a63SDavid du Colombier #include <libsec.h> 4*8ccd4a63SDavid du Colombier 5*8ccd4a63SDavid du Colombier #define Maxrand ((1UL<<31)-1) 6*8ccd4a63SDavid du Colombier 7*8ccd4a63SDavid du Colombier ulong nfastrand(ulong n)8*8ccd4a63SDavid du Colombiernfastrand(ulong n) 9*8ccd4a63SDavid du Colombier { 10*8ccd4a63SDavid du Colombier ulong m, r; 11*8ccd4a63SDavid du Colombier 12*8ccd4a63SDavid du Colombier /* 13*8ccd4a63SDavid du Colombier * set m to the maximum multiple of n <= 2^31-1 14*8ccd4a63SDavid du Colombier * so we want a random number < m. 15*8ccd4a63SDavid du Colombier */ 16*8ccd4a63SDavid du Colombier if(n > Maxrand) 17*8ccd4a63SDavid du Colombier abort(); 18*8ccd4a63SDavid du Colombier 19*8ccd4a63SDavid du Colombier m = Maxrand - Maxrand % n; 20*8ccd4a63SDavid du Colombier while((r = fastrand()) >= m) 21*8ccd4a63SDavid du Colombier ; 22*8ccd4a63SDavid du Colombier return r%n; 23*8ccd4a63SDavid du Colombier } 24