[Bug libstdc++/54523] New: srand() initializing seed for random() function

jm3dev at gmail dot com gcc-bugzilla@gcc.gnu.org
Fri Sep 7 23:34:00 GMT 2012


http://gcc.gnu.org/bugzilla/show_bug.cgi?id=54523

             Bug #: 54523
           Summary: srand() initializing seed for random() function
    Classification: Unclassified
           Product: gcc
           Version: 4.4.6
            Status: UNCONFIRMED
          Severity: normal
          Priority: P3
         Component: libstdc++
        AssignedTo: unassigned@gcc.gnu.org
        ReportedBy: jm3dev@gmail.com


DESCRIPTION: This problem arises if you mix the use of this two ways of
generating random numbers: the srand()/rand() way and the srandom()/random()
function family. The issue is that srand() is somehow initializing the seed for
random() function, but it should be initialized *only* with srandom(). The
expected behavior is random() generator not modifying its seed until done by
srandom(), the current behavior is srand() changing that seed.

IMPACT: As happened to me with a scientific code, it could imply a portability
problem as this is working properly (from my humble point of view) in other
implementations of the library. I detected (and just reported) also the problem
in GNU implementation of glibc 2.12 with C.

HOW TO REPRODUCE: This is a short test program, rndtest.cpp:

---- START SOURCE CODE ----
// Test random()
#include <iostream>
#include <cstdlib>

using namespace std;

int main() {

  int i;

  srand((unsigned)time(NULL));

  for (i=1;i<11;i++) {
    cout << (random() / (double)0x7fffffff) << endl;
  }
}
---- SOURCE CODE END ----

This is what you get with libstdc++-devel-4.4.6:

$ g++ -O0 -g -Wall rndtest.cpp -o rndtest
$ ./rndtest 
0.735861
0.130081
0.954666
0.622049
0.423014
0.0441652
0.855401
0.895524
0.178504
0.758294
$ ./rndtest 
0.599818
0.550412
0.763289
0.448671
0.365695
0.772274
0.224044
0.700837
0.492885
0.85191

This is the expected (what you get in the mentioned other implementation of
cstdlib):

> ./rndtest
0.840188
0.394383
0.783099
0.79844
0.911647
0.197551
0.335223
0.76823
0.277775
0.55397
> ./rndtest
0.840188
0.394383
0.783099
0.79844
0.911647
0.197551
0.335223
0.76823
0.277775
0.55397

Many thanks.



More information about the Gcc-bugs mailing list