设置并返回 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::Entropy、Crypt::Random、Math::Random::Secure 和 Math::TrulyRandom。