Hi, gcc team!

i unfortunately cannot use the bug db for this report because i am not
allowed to use this email address for websites, mailing lists, etc.

Bug summary: The two-arg form of std::random_shuffle() shuffles predictably
unless srand() is called beforehand.

GCC version:
gcc (GCC) 4.0.2
Copyright (C) 2005 Free Software Foundation, Inc.
This is free software; see the source for copying conditions.  There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.


// ---------------------------------------------------------
// Begin source code:
#include <string> // std::string
#include <vector> // std::string
#include <iostream> // cout/cerr
#include <iterator>
#include <algorithm> // cout/cerr
#include <stdlib.h> // rand(), srand()
#include <time.h> // time()

int main( int argc, char **argv )
{

  //srand(time(NULL));
  // ACHTUNG: if srand() is not called then random_shuffle() always
  // shuffles with the same results. This is undocumented behaviour
  // and is probably limited to the GNU/GCC STL implementation.
  // No STL documentation i have ever read (or can find at the moment)
  // calls for explicitely seeding the RNG used by random_shuffle().

  typedef std::vector<std::string> SVec;
  SVec vec;

  std::string line;
  while( std::getline( std::cin, line ) ) {
    vec.push_back( line );
  }

  std::random_shuffle( vec.begin(), vec.end() );

  std::copy( vec.begin(), vec.end(),
             std::ostream_iterator<std::string>( std::cout, "\n" ) );

  return 0;
}
//----------------------------------------------------------
//end source code


Compile with:

        gcc -o shuffle shuffle.cpp -lstdc++

Reproducing the behaviour:

        Run on any list of input (e.g., a file with the numbers 1..5, one
number
per line), and repeat this any number of times. The results of the shuffling
will always be the same. e.g.: Input file 'foo' contains the letters "d c b
a",
one per line and in that order:

for i in 1 1 1 1 1; do ./shuffle < foo; sleep 1; done
d
a
c
b
d
a
c
b
d
a
c
b
d
a
c
b
d
a
c
b


Workaround: If the srand() line is uncommented, random_shuffle() shuffles
unpredictably (as
it should).

i have not found any STL documentation stating that the underlying system
RNG must be seeded
before using random_shuffle(), and can also find no examples on the web
demonstrating that it
should/must be seeded for proper operation. IMO this places an unwarranted
(and certainly
undocumented) expectation on the user.

Take care,

----- stephan beal


Reply via email to