Unix Shell - 为什么相同的 $RANDOM 数字会重复?

Joh*_*ese 8 unix random bash zsh kali-linux

我正在 Unix shell 中试验 $RANDOM 变量,并注意到一些奇怪的事情。我运行了以下命令,该命令循环读取 $RANDOM 100k 次,然后将输出传输到“uniq”以查找重复项。

$ for i in {1..100000}; do echo $RANDOM; done | uniq -d
Run Code Online (Sandbox Code Playgroud)

我运行上述命令 7 次,相同的两个数字(4455 和 4117)重复了 7 次。下面的屏幕截图显示了命令行输出。

$ for i in {1..100000}; do echo $RANDOM; done | uniq -d
Run Code Online (Sandbox Code Playgroud)

请参阅: https: //i.stack.imgur.com/5bpEe.png

我还打开了另一个终端窗口并重复了该过程。在第二个航站楼中,数字不同,但以类似的方式重复。这让我想知道 $RANDOM 变量的熵何时以及如何播种。

我的猜测是,每当调用它时,它都会重新播种bash,但我想知道是否有人知道当我在单个终端窗口中重复该命令时为什么会重复相同的值。

lol*_*que 14

这是由于子 shell 中 RANDOM 的 zsh bug/“行为”造成的。这个错误不会出现在 bash 中。

echo $RANDOM # changes at every run  
echo `echo $RANDOM` # always return the same value until you call the first line
Run Code Online (Sandbox Code Playgroud)

因为 RANDOM 是以其最后一个值作为种子的,但在子 shell 中获得的值不会在主 shell 中更新。

man zshparam

RANDOM <S>
A  pseudo-random  integer  from 0 to 32767, newly generated each
time this parameter is referenced.  The random number  generator
can be seeded by assigning a numeric value to RANDOM.

The   values   of   RANDOM   form   an  intentionally-repeatable
pseudo-random sequence; subshells  that  reference  RANDOM  will
result  in  identical  pseudo-random  values unless the value of
RANDOM is referenced or seeded in the parent  shell  in  between
subshell invocations.
Run Code Online (Sandbox Code Playgroud)

更疯狂的是因为调用uniq会创建一个子 shell

for i in {1..10}; do echo $RANDOM; done # changes at every run 
for i in {1..10}; do echo $RANDOM; done | uniq # always the same 10 numbers
Run Code Online (Sandbox Code Playgroud)

来源:Debian 错误报告 828180