perl - 加载 perl 模块时只调用一次 srand

标签 perl random perl-module srand

我的脚本被分成多个包。 main.pl加载A.pm,它加载A::B.pmA::C.pm。他们都使用rand。但是,如果我在 main.pl 中为 srand 指定一个种子,后面的模块似乎无论如何都会生成它们自己的种子。我如何才能仅对 RNG 进行一次播种并使整个脚本可预测?

最佳答案

在加载A 之前,将srand 放入main.plBEGIN block 中:

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 之后,那么前三个打印(来自 ABC) 是随机数,只有 main.pl 中的那个总是相同的。

关于perl - 加载 perl 模块时只调用一次 srand,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/71794658/

相关文章:

perl - 随机选择一个区域并进行多次处理

perl - 无法通过包 "new"定位对象方法 "IO::Socket::SSL"

c - 加权随机数生成

java - 查找/打印在找到随机数之前生成了多少个数字

.net - Random.Next 代码契约不正确吗?

Perl:无法通过包定位对象方法栏

perl - OS X CPAN Perl 模块安装问题

perl 求幂结果为 "nan"

Perl:将当前时间与特定时间进行比较

perl - 使用 Perl DBI 获取所有记录