我一直在想这将是获得最佳的方式很好在bash,即随机性,这将是一个过程,以获得之间的随机正整数MIN
,并MAX
使得
在 bash 中获得随机性的一种有效方法是使用$RANDOM
变量。但是,这仅对 0 到 2 15 -1之间的值进行采样,这对于所有用途来说可能不够大。人们通常使用模数将其置于他们想要的范围内,例如,
MIN=0
MAX=12345
rnd=$(( $RANDOM % ($MAX + 1 - $MIN) + $MIN ))
Run Code Online (Sandbox Code Playgroud)
此外,这会产生偏差,除非$MAX
碰巧除以 2 15 -1=32767。例如,如果$MIN
是 0 并且$MAX
是 9,那么值 0 到 7 的可能性比值 8 和 9 稍大,$RANDOM
永远不会是 32768 或 32769。随着范围的增加,这种偏差会变得更糟,例如,如果$MIN
是 0 并且$MAX
是9999,那么数字 0 到 2767 的概率为4 / 32767,而数字 2768 到 9999 的概率仅为 …
环境:
什么是已知的:
RANDOM
通过以下方式给出一个 15 位范围内的随机数:
echo $RANDOM
Run Code Online (Sandbox Code Playgroud)
SRANDOM
通过以下方式给出 32 位范围内的随机数:
echo $SRANDOM
Run Code Online (Sandbox Code Playgroud)
RANDOM
可以通过以下方式配置为在 30 位范围内创建随机数:
my_rnd=$(((RANDOM<<15|RANDOM)))
echo "$my_rnd"
Run Code Online (Sandbox Code Playgroud)
RANDOM
可以通过以下方式配置为在 45 位范围内创建随机数:
my_rnd=$(((RANDOM<<15|RANDOM)<<15|RANDOM))
echo "$my_rnd"
Run Code Online (Sandbox Code Playgroud)
如何配置RANDOM
以获得与使用时相同的 32 位随机数范围SRANDOM
?