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)