【问题标题】:Generate uniform random number in range of floats in bash [duplicate]在bash中的浮点数范围内生成统一的随机数[重复]
【发布时间】: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[@]}

我尝试过$RANDOMawk,但它对我不起作用。我不想使用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&lt;=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


【解决方案1】:

最常见的rand() 实现至少会在[0...1) 范围内生成一个数字,这确实是您所需要的。您可以使用this question 的答案中概述的技术将一个范围内的随机数缩放到另一个范围内的数字,例如:

NewValue = (((OldValue - OldMin) * (NewMax - NewMin)) / (OldMax - OldMin)) + NewMin

对于 bash,您有两种选择:整数运算或使用不同的工具。

从命令行支持浮点运算的工具的一些选择包括:

  • 不同的外壳(例如,zsh)
  • perl: my $x = $minimum + rand($maximum - $minimum);
  • ruby: x = min + rand * (max-min)
  • awkawk -v min=3 -v max=17 'BEGIN{srand(); print min+rand()*int(1000*(max-min)+1)/1000}'
    注意The original answer this was copied from 坏了;以上是为了帮助解决问题而稍作修改。
  • bc: printf '%s\n' $(echo "scale=8; $RANDOM/32768" | bc )

...仅举几例。

【讨论】:

  • 请注意,创建 -> insta-delete -> 编辑 -> 取消删除工作流在为规避站点规则(明确包括“不回答已删除的问题”规则)而执行时可能构成违反规则)。我正在寻找最近出现的Meta Stack Overflow 讨论;当我找到它时会链接它。
  • 明白。在我完成输入之前,我不小心点击了提交。不会再发生了。
  • @BrianVandenberg $ awk -v min=4 -v max=4.5 'BEGIN{srand(); print min+rand()*(max-min+1)}' $ 5.46869 -> 这就是 (max-min + 1) 不起作用的原因。
  • @BrianVandenberg 我已经测试并编辑了您的答案。
  • @BrianVandenberg 查看与您建议的答案相同的评论。
猜你喜欢
  • 1970-01-01
  • 2013-12-20
  • 1970-01-01
  • 1970-01-01
  • 2015-10-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多