Bash 随机变量 = 不是那么随机?

Bash Random Variables = Not so random?

我想生成一个随机小数,四舍五入到 .1 和 1 之间的第 10 位。

我是用命令

做的
`echo "scale=1; $(( ( RANDOM % 10 ) + 1 ))/10" | bc -l`

现在如果你将它设置为变量,比如

var=`echo "scale=1; $(( ( RANDOM % 10 ) + 1 ))/10" | bc -l`

并让你的脚本像这样回显 var,

#!/bin/bash
var=`echo "scale=1; $(( ( RANDOM % 10 ) + 1 ))/10" | bc -l`
echo $var
echo $var
echo $var

它重复相同的小数点,比如说 .4,但是如果你

#!/bin/bash
echo `echo "scale=1; $(( ( RANDOM % 10 ) + 1 ))/10" | bc -l`
echo `echo "scale=1; $(( ( RANDOM % 10 ) + 1 ))/10" | bc -l`
echo `echo "scale=1; $(( ( RANDOM % 10 ) + 1 ))/10" | bc -l`

它将使用与

相同的命令为您提供三个随机数
$var=`echo "scale=1; $(( ( RANDOM % 10 ) + 1 ))/10" | bc -l`

为什么 Bash 如果给出相同的命令但作为变量不生成三个新数字?

以下命令为 var 设置一个值:

var=`echo "scale=1; $(( ( RANDOM % 10 ) + 1 ))/10" | bc -l`

该值一旦设置,就不会改变。因此,无论您查看多少次,它都将是相同的:

echo $var
echo $var
echo $var

获得新值的唯一方法是 bash 再次计算 RANDOM

改用函数

您可能更喜欢在每次调用时 return 不同随机变量的函数:

$ var() { echo "scale=1; $(( ( RANDOM % 10 ) + 1 ))/10" | bc -l; }
$ var
.3
$ var
.4
$ var
1.0
$ var
.4

因为

var=`echo "scale=1; $(( ( RANDOM % 10 ) + 1 ))/10" | bc -l`

执行 echo 命令并 将其输出 存储到一个变量中。命令本身仅由 bash 解释器求值一次。

如果你想要一种紧凑的方式来生成随机数,我建议使用 函数:

#!/bin/bash
myRandom(){
    echo "scale=1; $(( ( RANDOM % 10 ) + 1 ))/10" | bc -l
}

echo $(myRandom)
echo $(myRandom)
echo $(myRandom)