Unix外壳-为什么相同的$RANDOM数是重复的? [英] Unix Shell - Why are the same $RANDOM numbers repeated?

查看:23
本文介绍了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

来源:Debian bug report 828180

这篇关于Unix外壳-为什么相同的$RANDOM数是重复的?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆