shell - 子shell中对$RANDOM的引用都返回相同的值

标签 shell random zsh

以下简短脚本打印一个随机的十位二进制数:

#!/usr/bin/zsh
point=''
for i in `seq 1 10`
do
    echo $RANDOM >/dev/null
    point=$point`if [ $RANDOM -gt 16383 ]; then echo 0; else echo 1; fi`
done
echo $point

但是,如果我删除明显无用的 echo $RANDOM >/dev/null行,脚本总是打印 11111111110000000000 .

为什么?

最佳答案

子shell(由反引号创建,或其现代替代品 $() )在与父shell不同的上下文中执行——这意味着当它们退出时,所有进程本地状态的变化——包括随机数生成器的状态——都会被抛出离开。

阅读自 $RANDOM父 shell 内部会更新 RNG 的状态,这就是 echo $RANDOM >/dev/null 的原因。有效果。

就是说,不要那样做。做这样的事情,它根本没有子shell:

point=
for ((i=0; i<10; i++)); do
  point+=$(( (RANDOM > 16383) ? 0 : 1 ))
done

如果你测试这个生成超过 10 位数字——比如尝试,比如 1000 或 10000——你还会发现它的性能比原来的好得多。

关于shell - 子shell中对$RANDOM的引用都返回相同的值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32577117/

相关文章:

c - shell c 中的输入输出重定向

linux - 如何更改所有用户和所有 shell 的路径?

plugins - 终端中 zsh 顶部的固定行

python - 创建一系列数字随机洗牌的二维数组的有效方法

sql - 生成 1 - 10 范围内的随机数

macos - 如何让 ZSH 在终端框架中显示当前目录?

linux - 根据文件类型对文件进行排序

linux - 复杂的 shell 通配符

linux - 根据括号的数量删除行?

Java - 生成随机 -1 或 1?