@@ -48,6 +48,14 @@ command currcmd;
4848
4949gmp_randclass gmp_rnd (gmp_randinit_default);
5050
51+ // Simple function to get a random integer in the range [0,n-1].
52+ // Assumes that the gmp_rnd global variable has been initialized.
53+ unsigned long get_random (unsigned long n)
54+ {
55+ mpz_class x = gmp_rnd.get_z_range (n);
56+ return x.get_ui ();
57+ }
58+
5159databuffer data;
5260vector<command> program;
5361
@@ -584,16 +592,18 @@ bool dotest(const test& t)
584592 case ' !' : return !dotest (t.args [0 ]);
585593 case ' &' : return dotest (t.args [0 ]) && dotest (t.args [1 ]);
586594 case ' |' : return dotest (t.args [0 ]) || dotest (t.args [1 ]);
587- case ' E' : if ( gendata ) {
588- return (random () % 10 < 3 );
589- } else {
590- return data.eof ();
591- }
592- case ' M' : if ( gendata ) {
593- return (random () % 2 == 0 );
594- } else {
595- return !data.eof () && t.args [0 ].val .find (data.next ())!=string::npos;
596- }
595+ case ' E' :
596+ if ( gendata ) {
597+ return (get_random (10 ) < 3 );
598+ } else {
599+ return data.eof ();
600+ }
601+ case ' M' :
602+ if ( gendata ) {
603+ return (get_random (2 ) == 0 );
604+ } else {
605+ return !data.eof () && t.args [0 ].val .find (data.next ())!=string::npos;
606+ }
597607 case ' U' : return unique (t.args );
598608 case ' A' : return inarray (t.args [0 ],t.args [1 ]);
599609 case ' ?' : return compare (t);
@@ -676,7 +686,7 @@ int getmult(string &exp, unsigned int &index)
676686 max = 1 ;
677687 }
678688
679- return (min + random () % (1 + max - min));
689+ return (min + get_random (1 + max - min));
680690}
681691
682692string genregex (string exp)
@@ -700,7 +710,7 @@ string genregex(string exp)
700710 {
701711 int mult = getmult (exp, i);
702712 for (int cnt = 0 ; cnt < mult; cnt++) {
703- res += (char ) (' ' + ( random () % (int ) (' ~' - ' ' )));
713+ res += (char ) (' ' + get_random ( (int ) (' ~' - ' ' )));
704714 }
705715 }
706716 break ;
@@ -748,7 +758,7 @@ string genregex(string exp)
748758 }
749759 int mult = getmult (exp, i);
750760 for (int cnt = 0 ; cnt < mult; cnt++) {
751- res += possibleVec[random () % possibleVec.size ()];
761+ res += possibleVec[get_random ( possibleVec.size () )];
752762 }
753763 }
754764 break ;
@@ -777,7 +787,7 @@ string genregex(string exp)
777787 alternatives.push_back (exp.substr (begin, i - begin));
778788 int mult = getmult (exp, i);
779789 for (int cnt = 0 ; cnt < mult; cnt++) {
780- res += genregex (alternatives[random () % alternatives.size ()]);
790+ res += genregex (alternatives[get_random ( alternatives.size () )]);
781791 }
782792 }
783793 break ;
@@ -1233,11 +1243,10 @@ void init_checktestdata(std::istream &progstream, int opt_mask)
12331243 for (size_t i=0 ; i<program.size (); i++) cerr << program[i] << endl;
12341244 }
12351245
1236- // Initialize random generators
1246+ // Initialize random generator
12371247 struct timespec time;
12381248 clock_gettime (CLOCK_REALTIME,&time);
12391249 mpz_class seed = 1000000000 * mpz_class (time.tv_sec ) + time.tv_nsec ;
1240- srandom (seed.get_ui ());
12411250 gmp_rnd.seed (seed);
12421251
12431252 // Initialize current position in program.
0 commit comments