random numbers

Andrew Hume andrew at alice.UUCP
Wed Aug 30 14:34:46 AEST 1989



if you can tolerate a congruential style generator, try this:

/*
	random number generator from cacm 31 10, oct 88
	for 32 bit integers (called long here)
*/

#ifdef	MAIN
#define	A	16807		/* good numbers */
#define	M	2147483647
#define	Q	127773
#define	R	2836
#else
#define	A	48271		/* better numbers */
#define	M	2147483647
#define	Q	44488
#define	R	3399
#endif

static long seed;

srand(unsigned newseed)
{
	seed = newseed;
}

rand()
{
	long lo, hi, test;

	hi = seed/Q;
	lo = seed%Q;
	test = A*lo - R*hi;
	if(test > 0)
		seed = test;
	else
		seed = test+M;
	return(seed);
}

#ifdef	MAIN

main()
{
	int i;

	srand(1);
	for(i = 0; i < 10000; i++)
		rand();
	if(seed == 1043618065)
		printf("implementation looks correct\n");
	else
		printf("uh oh! seed=%u, should be 1043618065\n", seed);
	exit(0);
}
#endif

compile with -DMAIN to test.



More information about the Comp.lang.c mailing list