以下短脚本打印一个随机的十位二进制数字:
#!/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
。
为什么?
答案 0 :(得分:5)
从手册页:
RANDOM的值形成有意重复的伪随机序列;引用的子壳 除非参考或播种RANDOM的值,否则RANDOM将产生相同的伪随机值 在子shell调用之间的父shell中。
对echo
的“无用”调用提供了一个引用,允许命令替换引起的子shell每次都产生不同的值。
答案 1 :(得分:4)
子shell(由反引号创建,或者它们的现代替换$()
)在与父shell不同的上下文中执行 - 这意味着当它们退出时,所有进程本地状态更改 - 包括< / em>随机数生成器的状态 - 被丢弃。
从父shell中的$RANDOM
读取更新RNG的状态,这就是echo $RANDOM >/dev/null
有效的原因。
那就是说,不要这样做。做这样的事情,根本没有下属:
point=
for ((i=0; i<10; i++)); do
point+=$(( (RANDOM > 16383) ? 0 : 1 ))
done
如果你测试这个产生的数字超过10位 - 试试,比方说1000或10000 - 你也会发现它的表现远远好于原作。