awk
手册说“srand
为”设置种子(起点)rand()
。我使用srand(5)
了以下代码:
awk 'BEGIN {srand(5);while(1)print rand()}'> /var/tmp/rnd
它生成如下数字:
0.177399
0.340855
0.0256178
0.838417
0.0195347
0.29598
你能解释一下如何srand(5)
用上面的输出生成“起点”吗?
起点称为种子。它被赋予 rand 函数的第一次迭代。在那之后,rand 使用它在计算旧数字时得到的前一个值——来生成下一个数字。对种子使用素数是个好主意。
PRNG(伪随机数生成器)通过保持某种内部状态来产生随机值,这种内部状态可以通过一系列重复周期非常大的值来推进,只要我们使用 far,它们的连续值几乎没有明显的统计相关性他们更少。但尽管如此,它的值是一个确定的序列。
“播种” PRNG 基本上是在确定性序列中选择从哪个点开始。该算法将传递的数字作为种子并计算(以某种算法特定的方式)在序列中从哪里开始。种子的实际值无关紧要——算法不应该以任何方式依赖它。
但是,虽然种子值本身并不直接参与 PRNG 算法,但它确实唯一标识了序列中的起点,所以如果给定一个特定的种子,然后生成一个值序列,用相同的值再次播种应该会导致PRNG 生成相同的值序列。