/* * Program to test leapfrog LCG RNG. * * Command-line arguments are seed, number of samples, number of streams * (processes or threads for the Monte Carlo pi program). * * Notice that for a given seed and number of samples this should generate * the same results for any number of streams, and if it doesn't, something * is wrong! */ #include #include #include #include #include #include "leapfrog-lcg.h" int main(int argc, char* argv[]) { char* usage_msg = "arguments: seed, number of sample, number of streams\n"; if (argc < 3) { fprintf(stderr, usage_msg); return EXIT_FAILURE; } char *endptr; long seed = strtol(argv[1], &endptr, 10); if ((*endptr != '\0') || (seed < 1)) { fprintf(stderr, usage_msg); return EXIT_FAILURE; } long num_samples = strtol(argv[2], &endptr, 10); if ((*endptr != '\0') || (num_samples < 1)) { fprintf(stderr, usage_msg); return EXIT_FAILURE; } int num_streams = strtol(argv[3], &endptr, 10); if ((*endptr != '\0') || (num_streams < 1)) { fprintf(stderr, usage_msg); return EXIT_FAILURE; } rand_state_t rstates[num_streams]; for (int i = 0; i < num_streams; ++i) { rand_init_state(num_streams, i, &rstates[i]); rand_set_seed(seed, &rstates[i]); printf("p %d, id %d, a %"PRId64", b %"PRId64", value %"PRId64"\n", num_streams, i, rstates[i].a, rstates[i].b, rstates[i].next_value); } int stream_id = 0; for (long i = 0; i < num_samples; ++i) { int64_t n = rand_next(&rstates[stream_id]); double d = (double) n / (double) RANDMAX; fprintf(stdout, "%20"PRId64" %17.15f\n", n, d); stream_id = (stream_id + 1) % num_streams; } return EXIT_SUCCESS; }