Home > Enterprise >  Call srand only once when loading perl modules
Call srand only once when loading perl modules

Time:04-08

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.

  • Related