以下简短脚本打印一个随机的十位二进制数:
#!/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
行,脚本总是打印 1111111111
或 0000000000
.为什么?
最佳答案
子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/