My script is separated into multiple packages. main.pl loads A.pm, which loads A::B.pm and A::C.pm. They all use rand. However, if I specify a seed for srand in main.pl, the latter modules seem to generate their own seed anyway. How can I seed the RNG only once and have the entire script predictable?
CodePudding user response:
Put srand in a BEGIN block in main.pl, before loading A:
use strict;
use warnings;
...
BEGIN { srand(7) }
use A;
...
A complete example:
A.pm:
package A;
use B;
use C;
CORE::say "A: ", rand();
B.pm:
package B;
CORE::say "B: ", rand();
C.pm:
package C;
CORE::say "C: ", rand();
main.pl:
BEGIN { srand(7) }
use A;
CORE::say "main: ", rand();
Running perl -I . main.pl always print:
B: 0.266444196765409
C: 0.682035230190621
A: 0.265490593427
main: 0.129110848853948
If I put srand(7) after use A, then the first three prints (from A, B and C) are randoms, and only the one in main.pl is always the same.
