@@ -48,6 +48,14 @@ command currcmd;
48
48
49
49
gmp_randclass gmp_rnd (gmp_randinit_default);
50
50
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
+
51
59
databuffer data;
52
60
vector<command> program;
53
61
@@ -584,16 +592,18 @@ bool dotest(const test& t)
584
592
case ' !' : return !dotest (t.args [0 ]);
585
593
case ' &' : return dotest (t.args [0 ]) && dotest (t.args [1 ]);
586
594
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
+ }
597
607
case ' U' : return unique (t.args );
598
608
case ' A' : return inarray (t.args [0 ],t.args [1 ]);
599
609
case ' ?' : return compare (t);
@@ -676,7 +686,7 @@ int getmult(string &exp, unsigned int &index)
676
686
max = 1 ;
677
687
}
678
688
679
- return (min + random () % (1 + max - min));
689
+ return (min + get_random (1 + max - min));
680
690
}
681
691
682
692
string genregex (string exp)
@@ -700,7 +710,7 @@ string genregex(string exp)
700
710
{
701
711
int mult = getmult (exp, i);
702
712
for (int cnt = 0 ; cnt < mult; cnt++) {
703
- res += (char ) (' ' + ( random () % (int ) (' ~' - ' ' )));
713
+ res += (char ) (' ' + get_random ( (int ) (' ~' - ' ' )));
704
714
}
705
715
}
706
716
break ;
@@ -748,7 +758,7 @@ string genregex(string exp)
748
758
}
749
759
int mult = getmult (exp, i);
750
760
for (int cnt = 0 ; cnt < mult; cnt++) {
751
- res += possibleVec[random () % possibleVec.size ()];
761
+ res += possibleVec[get_random ( possibleVec.size () )];
752
762
}
753
763
}
754
764
break ;
@@ -777,7 +787,7 @@ string genregex(string exp)
777
787
alternatives.push_back (exp.substr (begin, i - begin));
778
788
int mult = getmult (exp, i);
779
789
for (int cnt = 0 ; cnt < mult; cnt++) {
780
- res += genregex (alternatives[random () % alternatives.size ()]);
790
+ res += genregex (alternatives[get_random ( alternatives.size () )]);
781
791
}
782
792
}
783
793
break ;
@@ -1233,11 +1243,10 @@ void init_checktestdata(std::istream &progstream, int opt_mask)
1233
1243
for (size_t i=0 ; i<program.size (); i++) cerr << program[i] << endl;
1234
1244
}
1235
1245
1236
- // Initialize random generators
1246
+ // Initialize random generator
1237
1247
struct timespec time;
1238
1248
clock_gettime (CLOCK_REALTIME,&time);
1239
1249
mpz_class seed = 1000000000 * mpz_class (time.tv_sec ) + time.tv_nsec ;
1240
- srandom (seed.get_ui ());
1241
1250
gmp_rnd.seed (seed);
1242
1251
1243
1252
// Initialize current position in program.
0 commit comments