加载 perl 模块时只调用一次 srand
Call srand only once when loading perl modules
我的脚本被分成多个包。 main.pl
加载 A.pm
,后者加载 A::B.pm
和 A::C.pm
。他们都使用rand
。但是,如果我在 main.pl
中为 srand
指定一个种子,后面的模块似乎无论如何都会生成它们自己的种子。我怎样才能只为 RNG 播种一次并使整个脚本可预测?
在加载 A
之前,将 srand
放入 main.pl
的 BEGIN
块中:
use strict;
use warnings;
...
BEGIN { srand(7) }
use A;
...
一个完整的例子:
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();
运行 perl -I . main.pl
总是打印:
B: 0.266444196765409
C: 0.682035230190621
A: 0.265490593427
main: 0.129110848853948
如果我把 srand(7)
放在 use A
之后,那么前三个印刷品(来自 A
、B
和 C
)是随机的,并且只有main.pl
中的那个总是相同的。
我的脚本被分成多个包。 main.pl
加载 A.pm
,后者加载 A::B.pm
和 A::C.pm
。他们都使用rand
。但是,如果我在 main.pl
中为 srand
指定一个种子,后面的模块似乎无论如何都会生成它们自己的种子。我怎样才能只为 RNG 播种一次并使整个脚本可预测?
在加载 A
之前,将 srand
放入 main.pl
的 BEGIN
块中:
use strict;
use warnings;
...
BEGIN { srand(7) }
use A;
...
一个完整的例子:
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();
运行 perl -I . main.pl
总是打印:
B: 0.266444196765409
C: 0.682035230190621
A: 0.265490593427
main: 0.129110848853948
如果我把 srand(7)
放在 use A
之后,那么前三个印刷品(来自 A
、B
和 C
)是随机的,并且只有main.pl
中的那个总是相同的。