Blame stdlib/tst-random.c

Packit Service 82fcde
/* Test program for random(), srandom(), initstate(), setstate()
Packit Service 82fcde
   Written by Michael J. Fischer, August 21, 2000
Packit Service 82fcde
   Placed in the public domain.  */
Packit Service 82fcde
Packit Service 82fcde
/* This program primarily tests the correct functioning of srandom()
Packit Service 82fcde
   and setstate().  The strategy is generate and store a set of random
Packit Service 82fcde
   sequences, each with a specified starting seed.  Then each sequence
Packit Service 82fcde
   is regenerated twice and checked against the stored values.
Packit Service 82fcde
Packit Service 82fcde
   First they are regenerated one sequence at a time, using srandom()
Packit Service 82fcde
   to set the initial state.  A discrepency here would suggest that
Packit Service 82fcde
   srandom() was failing to completely initialize the random number
Packit Service 82fcde
   generator.
Packit Service 82fcde
Packit Service 82fcde
   Second the sequences are regenerated in an interleaved order.
Packit Service 82fcde
   A state vector is created for each sequence using initstate().
Packit Service 82fcde
   setstate() is used to switch from sequence to sequence during
Packit Service 82fcde
   the interleaved generation.  A discrepency here would suggest
Packit Service 82fcde
   a problem with either initstate() failing to initialize the
Packit Service 82fcde
   random number generator properly, or the failure of setstate()
Packit Service 82fcde
   to correctly save and restore state information.  Also, each
Packit Service 82fcde
   time setstate() is called, the returned value is checked for
Packit Service 82fcde
   correctness (since we know what it should be).
Packit Service 82fcde
Packit Service 82fcde
   Note:  We use default state vector for sequence 0 and our own
Packit Service 82fcde
   state vectors for the remaining sequences.  This is to give a check
Packit Service 82fcde
   that the value returned by initstate() is valid and can indeed be
Packit Service 82fcde
   used in the future.  */
Packit Service 82fcde
Packit Service 82fcde
/* Strategy:
Packit Service 82fcde
   1.  Use srandom() followed by calls on random to generate a set of
Packit Service 82fcde
       sequences of values.
Packit Service 82fcde
   2.  Regenerate and check the sequences.
Packit Service 82fcde
   3.  Use initstate() to create new states.
Packit Service 82fcde
   4.  Regenerate the sequences in an interleaved manner and check.
Packit Service 82fcde
*/
Packit Service 82fcde
Packit Service 82fcde
#include <stdlib.h>
Packit Service 82fcde
#include <stdio.h>
Packit Service 82fcde
Packit Service 82fcde
const int degree = 128;		/* random number generator degree (should
Packit Service 82fcde
				   be one of 8, 16, 32, 64, 128, 256) */
Packit Service 82fcde
const int nseq = 3;		/* number of test sequences */
Packit Service 82fcde
const int nrnd = 50;		/* length of each test sequence */
Packit Service 82fcde
const unsigned int seed[3] = { 0x12344321U, 0xEE11DD22U, 0xFEDCBA98 };
Packit Service 82fcde
Packit Service 82fcde
void fail (const char *msg, int s, int i) __attribute__ ((__noreturn__));
Packit Service 82fcde
Packit Service 82fcde
static int
Packit Service 82fcde
do_test (void)
Packit Service 82fcde
{
Packit Service 82fcde
  long int rnd[nseq][nrnd];	/* pseudorandom numbers */
Packit Service 82fcde
  char* state[nseq];		/* state for PRNG */
Packit Service 82fcde
  char* oldstate[nseq];		/* old PRNG state */
Packit Service 82fcde
  int s;			/* sequence index */
Packit Service 82fcde
  int i;			/* element index */
Packit Service 82fcde
Packit Service 82fcde
  printf ("Begining random package test using %d sequences of length %d.\n",
Packit Service 82fcde
	  nseq, nrnd);
Packit Service 82fcde
Packit Service 82fcde
  /* 1. Generate and store the sequences.  */
Packit Service 82fcde
  printf ("Generating random sequences.\n");
Packit Service 82fcde
  for (s = 0; s < nseq; ++s)
Packit Service 82fcde
    {
Packit Service 82fcde
      srandom ( seed[s] );
Packit Service 82fcde
      for (i = 0; i < nrnd; ++i)
Packit Service 82fcde
	rnd[s][i] = random ();
Packit Service 82fcde
    }
Packit Service 82fcde
Packit Service 82fcde
  /* 2. Regenerate and check.  */
Packit Service 82fcde
  printf ("Regenerating and checking sequences.\n");
Packit Service 82fcde
  for (s = 0; s < nseq; ++s)
Packit Service 82fcde
    {
Packit Service 82fcde
      srandom (seed[s]);
Packit Service 82fcde
      for (i = 0; i < nrnd; ++i)
Packit Service 82fcde
	if (rnd[s][i] != random ())
Packit Service 82fcde
	  fail ("first regenerate test", s, i);
Packit Service 82fcde
    }
Packit Service 82fcde
Packit Service 82fcde
  /* 3. Create state vector, one for each sequence.
Packit Service 82fcde
	First state is random's internal state; others are malloced.  */
Packit Service 82fcde
  printf ("Creating and checking state vector for each sequence.\n");
Packit Service 82fcde
  srandom (seed[0]);			/* reseed with first seed */
Packit Service 82fcde
  for (s = 1; s < nseq; ++s)
Packit Service 82fcde
    {
Packit Service 82fcde
      state[s] = (char*) malloc (degree);
Packit Service 82fcde
      oldstate[s] = initstate (seed[s], state[s], degree);
Packit Service 82fcde
    }
Packit Service 82fcde
  state[0] = oldstate[1];
Packit Service 82fcde
Packit Service 82fcde
  /* Check returned values.  */
Packit Service 82fcde
  for (s = 1; s < nseq - 1; ++s)
Packit Service 82fcde
    if (state[s] != oldstate[s + 1])
Packit Service 82fcde
      fail ("bad initstate() return value", s, i);
Packit Service 82fcde
Packit Service 82fcde
  /* 4. Regenerate sequences interleaved and check.  */
Packit Service 82fcde
  printf ("Regenerating and checking sequences in interleaved order.\n");
Packit Service 82fcde
  for (i = 0; i < nrnd; ++i)
Packit Service 82fcde
    {
Packit Service 82fcde
      for (s = 0; s < nseq; ++s)
Packit Service 82fcde
	{
Packit Service 82fcde
	  char *oldstate = (char *) setstate (state[s]);
Packit Service 82fcde
	  if (oldstate != state[(s + nseq - 1) % nseq])
Packit Service 82fcde
	    fail ("bad setstate() return value", s, i);
Packit Service 82fcde
	  if (rnd[s][i] != random ())
Packit Service 82fcde
	    fail ("bad value generated in interleave test", s, i);
Packit Service 82fcde
	}
Packit Service 82fcde
    }
Packit Service 82fcde
  printf ("All tests passed!\n");
Packit Service 82fcde
  return 0;
Packit Service 82fcde
}
Packit Service 82fcde
Packit Service 82fcde
void
Packit Service 82fcde
fail (const char *msg, int s, int i)
Packit Service 82fcde
{
Packit Service 82fcde
  printf ("\nTest FAILED: ");
Packit Service 82fcde
  printf ("%s (seq %d, pos %d).\n", msg, s, i);
Packit Service 82fcde
  exit (1);
Packit Service 82fcde
}
Packit Service 82fcde
Packit Service 82fcde
#define TEST_FUNCTION do_test ()
Packit Service 82fcde
#include "../test-skeleton.c"