srand EXPR
srand

设置并返回 rand 运算符的随机数种子。

该函数的目的是为 rand 函数“播种”,以便 rand 每次运行程序时都能产生不同的序列。当使用参数调用时,srand 使用该参数作为种子;否则它会(半)随机地选择一个种子(见下文)。无论哪种情况,从 Perl 5.14 开始,它都会返回种子。为了表明您的代码在最近版本的 Perl 上有效

use v5.14;	# so srand returns the seed

如果 srand 没有被显式调用,它会在第一次使用 rand 运算符时被隐式调用,不带参数。但是,有一些情况程序可能需要调用 srand。一种情况是生成可预测的结果,通常用于测试或调试。在这种情况下,您使用 srand($seed),每次使用相同的 $seed。另一种情况是,您可能希望在 fork 之后调用 srand,以避免子进程与父进程(以及彼此)共享相同的种子值。

每个进程中,不要多次调用srand()(即,不带参数)。随机数生成器的内部状态应该包含比任何种子都能提供的更多熵,因此再次调用srand实际上会丢失随机性。

大多数srand的实现都接受一个整数,并且会静默截断小数。这意味着srand(42)通常会产生与srand(42.1)相同的结果。为了安全起见,始终向srand传递一个整数。

返回种子的典型用途是用于测试程序,该程序在每次运行时可用的时间内组合过多,无法进行全面测试。它可以每次测试一个随机子集,如果出现故障,则记录用于该运行的种子,以便稍后用于重现相同的结果。

如果在进程启动期间将PERL_RAND_SEED环境变量设置为非负整数,则对srand()的无参数调用将使用一致的种子初始化 perl 随机数生成器,无论是在没有参数的情况下显式调用还是通过使用rand()隐式调用。给定PERL_RAND_SEED将产生的确切播种是故意未指定的,但使用不同的PERL_RAND_SEED值应该会产生不同的结果。这旨在用于调试和性能分析,并且仅保证在所有其他因素相等的情况下,在运行相同代码的相同 perl 可执行文件的调用之间产生一致的结果。环境变量仅在进程启动期间读取一次,在程序流程中更改它不会影响当前运行的进程。有关更多详细信息,请参见perlrun

rand不是加密安全的。您不应该在安全敏感的情况下依赖它。截至撰写本文时,许多第三方 CPAN 模块提供了随机数生成器,其作者旨在使其在加密上是安全的,包括:Data::EntropyCrypt::RandomMath::Random::SecureMath::TrulyRandom