int seeded_rand(int seed, int low, int high, int position){
int next;
int but = 2**31;
int bot = 2**16;
int[int] s;
int place = 0;
void srand(int x){
clear(s);
//probably wants to be an unsigned int (i.e. in range [0,2**32-1]) based on php-src/ext/standard/rand.c lines 44-52
s[0] = x;
for i from 1 to 30{
s[i] = (s[i-1] * 16807) % (but-1);
}
for i from 31 to 33{
s[i] = s[i-31];
}
for i from 34 to (344+position+1){
s[i] = (s[i-3] + s[i-31]) % (2*but);
}
}
int rand(int min, int max, int place){
//LCG stuff:
//from IBM and C and POSIX
//next = (1103515245 * next + 12345);
//next %= but;
//next &= but-bot;
//from some other C thing
//next = (1103515245 * next + 12345);
//next %= but*2;
//next &= but-bot;
//from MS Visual C
//next = (214013 * next + 2531011);
//next %= 2*but;
//next &= but-bot;
//glibc implementation
next = s[344+place] >> 1;
return (min + ( max - min + 1 ) * ( next / ( (but -1) + 1.0))) ;
//return (next);
}
srand(seed);
return rand(low, high, position);
}
Comments