Do all C compilers have the same rand() function?
No. The standard does not define a fixed implementation.
How can I tell two machines have the same rand() function?
The simplest test would be to print out some random values for a fixed seed. If they match, you most probably have the same implementation. E.g., you may try this piece of code:
#include <stdio.h>
#include <stdlib.h>
int main() {
int i;
srand(47);
for (i=0; i<10; i++) printf("%d\n",rand());
return 0;
}
What does that code output on your machine?
The output is the following sequence:
1773134790 1924001091 438623483 50210213 809830442 761766184 2023073002 729207936 708098155 2037448065
I don't have a C compiler that uses the GNU C library. Can I implement the same pseudo-random generator on my machine?
The GNU C library is distributed under the GPL. You can just
download it
and look at the implementation. (It's in the directory stdlib,
look for filenames containing the substring rand.)
Alternately, we even provide our own reference implementation below.
The ipsc_srandom and ipsc_random functions
are equivalent to the GNU C library functions srand and
rand we used.
#define GENERATOR_DEG 31
int32_t ipsc_random_table[GENERATOR_DEG] = {
-1726662223, 379960547, 1735697613, 1040273694, 1313901226, 1627687941,
-179304937, -2073333483, 1780058412, -1989503057, -615974602, 344556628,
939512070, -1249116260, 1507946756, -812545463, 154635395, 1388815473,
-1926676823, 525320961, -1009028674, 968117788, -123449607, 1284210865,
435012392, -2017506339, -911064859, -370259173, 1132637927, 1398500161,
-205601318,
};
int front_pointer=3, rear_pointer=0;
int32_t ipsc_random() {
int32_t result;
ipsc_random_table[ front_pointer ] += ipsc_random_table[ rear_pointer ];
result = ( ipsc_random_table[ front_pointer ] >> 1 ) & 0x7fffffff;
front_pointer++, rear_pointer++;
if (front_pointer >= GENERATOR_DEG) front_pointer = 0;
if (rear_pointer >= GENERATOR_DEG) rear_pointer = 0;
return result;
}
void ipsc_srandom(unsigned int seed) {
int32_t i, dst=0, kc=GENERATOR_DEG, word, hi, lo;
word = ipsc_random_table[0] = (seed==0) ? 1 : seed;
for (i = 1; i < kc; ++i) {
hi = word / 127773, lo = word % 127773;
word = 16807 * lo - 2836 * hi;
if (word < 0) word += 2147483647;
ipsc_random_table[++dst] = word;
}
front_pointer=3, rear_pointer=0;
kc *= 10;
while (--kc >= 0) ipsc_random();
}