【发布时间】:2020-11-11 16:24:33
【问题描述】:
[已解决]
我想在 bash 脚本的浮点数范围内生成一个统一的随机浮点数。范围例如[3.556,6.563]
基本上,我在 bash 中创建 LSH(拉丁超立方体采样)函数。在那里,我想生成一个数组,就像使用这个 python 命令行一样。
p = np.random.uniform(low=l_lim, high=u_lim, size=[n]).
示例代码:
lhs(){
l_lim=($(seq $1 $2 $(echo $3 - $dif | bc)))
h_lim=($(seq $(echo $1 + $dif | bc) $2 $3))
points=()
for ((i=0;i<$n;i++)) ; do
di=${l_lim[i]}
dj=${h_lim[i]}
echo $di, $dj
p=$(awk -v min=6.50 -v max=8.45 -v seed=$RANDOM 'BEGIN{srand(seed);print min+rand()*int(1000*(max-min)+1)/1000}')
points+=("${p}")
done
}
n=5
a=(3 5)
b=(1 3)
dif=$(div $(echo ${a[1]} - ${a[0]} | bc) $n)
lhs ${a[0]} 0.45 ${a[1]}
echo ${points[@]}
我尝试过$RANDOM、awk,但它对我不起作用。我不想使用python -c。
【问题讨论】:
-
请向我们展示如何您尝试使用 awk,以及它究竟是如何失败的——它是完成这项工作的最佳工具。
-
顺便说一下 --
export应该只在你有特定原因创建环境变量而不是常规 shell 变量时使用;array=( $(anything) )是反模式;见BashPitfalls #50。考虑在此处提问之前养成通过shellcheck.net 运行代码的习惯。 -
` 想复制 python 命令行 .. np.random.uniform ..` 我相信对于一个 stackoverflow 问题来说,这太宽泛了。或者不可能,正如我在 numpy 源代码中看到的那样,它在 C 源文件内部浮点表示中进行操作。这在 bash 中是不可能的。
-
@CharlesDuffy
$ awk -v min=$di -v max=$dj 'BEGIN{srand(); for (i=1;i<=num;i++) print min+rand()*int(1000*(max-min)+1)/1000}'但每次都会生成相同的数字。 -
谢谢@CharlesDuffy 它对我有用。解决方案:
p=$(awk -v min=$di -v max=$dj -v seed=$RANDOM 'BEGIN{srand(seed);print min+rand()*int(1000*(max-min)+1)/1000}')
标签: bash