Opened 13 years ago

Closed 13 years ago

#3516 closed Bugs (fixed)

lagged fibonacci cannot be seeded with a value 0 - fails with assertion error

Reported by: Paul H. Isaacson <paul.isaacson@…> Owned by: No-Maintainer
Milestone: Boost 1.41.0 Component: random
Version: Boost 1.40.0 Severity: Problem
Keywords: lagged fibonacci seed 0 Cc:

Description

When using the lagged_fibonacci607 and attempting to seed, the attached test program will either stop with an assertion error at line 57 of boost/random/linear_congruential.hpp, or if -DNDEBUG is used during compilation to disable assertions, the returned values are not in range.

Seeding with a zero value should not cause such problems.

#include <stdlib.h>
#include <stdio.h>
#include <boost/random/lagged_fibonacci.hpp>

using namespace std;

boost::lagged_fibonacci607 lfrand;

inline int fastrand (int range)
{
  return ((int) range * lfrand());
}

main (int argc, char **argv)
{
   unsigned int seed;

   if (argc < 2)
   {
     printf ("Usage lftest <seed>\n");
     exit (1);
   }

   sscanf (argv[1], "%d", &seed);
   printf ("using seed value %d\n", seed);

   lfrand.seed (seed);

   for (int n = 0; n < 1000000; n++)
   {
     int x = fastrand (10);
     if (x < 0 || x > 9)
       printf ("out of range random number[%d] = %d\n", n, x);
   }
}

Change History (3)

comment:1 by Steven Watanabe, 13 years ago

This is a limitation of the seeding algorithm. lagged_fibonacci::seed is documented to use minstd_rand0 which cannot be seeded with 0.

comment:2 by Steven Watanabe, 13 years ago

I think that the correct way to fix this is to change the wrap-around algorithm in linear_congruential so that it can handle zero.

comment:3 by Steven Watanabe, 13 years ago

Resolution: fixed
Status: newclosed

(In [57663]) Allow arbitrary values to be used as seeds for linear_congruential, linear_feedback_shift, and any generators that depend on them. Fixes #3516

Note: See TracTickets for help on using tickets.