用种子猛击随机?

用种子猛击随机?

我一直用它$((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出现的次数太多了。

相关内容