我一直用它$((1 + RANDOM % 1000))
来生成随机数。
是否可以做类似的事情但提供种子?
那么,给定相同的种子,总是会输出相同的随机数?
答案1
分配一个种子值RANDOM
$ bash -c 'RANDOM=640; echo $RANDOM $RANDOM $RANDOM'
28612 27230 24923
$ bash -c 'RANDOM=640; echo $RANDOM $RANDOM $RANDOM'
28612 27230 24923
$ bash -c 'RANDOM=640; echo $RANDOM $RANDOM $RANDOM'
28612 27230 24923
$
请注意,使用了单引号;双引号违反了 shell 插值规则:
$ bash -c 'RANDOM=42; echo $RANDOM $RANDOM $RANDOM'
19081 17033 15269
$ RANDOM=42
$ bash -c "RANDOM=640; echo $RANDOM"
19081
$ bash -c "RANDOM=640; echo $RANDOM"
17033
$ bash -c "RANDOM=640; echo $RANDOM"
15269
$
因为在子进程运行$RANDOM
之前由父 shell 进行插值。bash -c ...
使用单引号关闭插值(如上所示)或以其他方式阻止插值:
$ RANDOM=42
$ SEED_FOR_MY_GAME=640
$ bash -c "RANDOM=$SEED_FOR_MY_GAME; echo \$RANDOM"
28612
$ bash -c "RANDOM=$SEED_FOR_MY_GAME; echo \$RANDOM"
28612
$
手册RANDOM
中提到了这个功能bash(1)
RANDOM Each time this parameter is referenced, a random integer between
0 and 32767 is generated. The sequence of random numbers may be
initialized by assigning a value to RANDOM. If RANDOM is unset,
it loses its special properties, even if it is subsequently
reset.
答案2
我来晚了,但我不得不说一些关于“那么给定相同的种子,总是会输出相同的随机数?”我不明白这一点。
如果这就是您想要的,那么您不需要随机数。您可以跳过播种并使用您想要的“相同的随机数”。关于单引号和双引号的内容可能是嘲讽。
我想说有些评论是嘲讽。犹豫的时间太长了。
RANDOM=$(date +%s);echo $RANDOM; echo $RANDOM; echo $(($RANDOM%1000))
我认为这对于随机性来说已经是最好的了。但420出现的次数太多了。