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)
我想生成一个随机小数,四舍五入到 .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)