Unix外壳-为什么相同的$RANDOM数是重复的? [英] Unix Shell - Why are the same $RANDOM numbers repeated?
本文介绍了Unix外壳-为什么相同的$RANDOM数是重复的?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!
问题描述
我在Unix外壳程序中试验$RANDOM变量时,注意到了一些奇怪的事情。我运行了以下命令,该命令在一个循环中读取$RANDOM 100k次,然后通过管道将输出传递给";uniq";以查找重复项。
$ for i in {1..100000}; do echo $RANDOM; done | uniq -d
我将上述命令运行了7次,相同的两个数字(4455和4117)全部重复了7次。下面的屏幕截图显示了命令行输出。
kali@kali:~% for i in {1..100000}; do echo $RANDOM; done | uniq -d
4455
4117
kali@kali:~% for i in {1..100000}; do echo $RANDOM; done | uniq -d
4455
4117
kali@kali:~% for i in {1..100000}; do echo $RANDOM; done | uniq -d
4455
4117
kali@kali:~% for i in {1..100000}; do echo $RANDOM; done | uniq -d
4455
4117
kali@kali:~% for i in {1..100000}; do echo $RANDOM; done | uniq -d
4455
4117
kali@kali:~% for i in {1..100000}; do echo $RANDOM; done | uniq -d
4455
4117
kali@kali:~% for i in {1..100000}; do echo $RANDOM; done | uniq -d
4455
4117
参见:https://i.stack.imgur.com/5bpEe.png
我还打开了另一个终端窗口并重复了该过程。在第二个航站楼,数字不同,但以类似的方式重复。这让我想知道$随机变量的熵是什么时候,以及它是如何设定种子的。
我的猜测是,每当调用bash
时,它都会被重新设定种子,但我想知道,当我在单个终端窗口中重复命令时,是否有人知道为什么相同的值会重复。
推荐答案
这是由于子外壳中随机行为的zsh错误造成的。此错误未出现在bash中。
echo $RANDOM # changes at every run
echo `echo $RANDOM` # always return the same value until you call the first line
因为随机由其最后一个值设定种子,但在子外壳中,获取的值不会在主外壳中更新。
在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.
还有更疯狂的,因为调用uniq
会创建子外壳
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
这篇关于Unix外壳-为什么相同的$RANDOM数是重复的?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!
查看全文