如何在bash中不使用AWK、bc生成指定范围带小数的均匀分布随机数
bash环境生成指定小数位均匀分布随机数方案(无需awk/bc)
核心原理
bash原生仅支持整数运算,我们可以通过「放大取值范围生成整数+手动拼接小数点」的方式实现小数随机数生成,生成的结果可以直接给sleep这类支持小数参数的命令使用。
比如要生成2位小数的随机数,就把原范围放大100倍生成整数,再把最后两位作为小数位拼接即可;要5位小数就放大100000倍,以此类推。
完整可运行代码示例
下面的示例支持自定义取值范围、小数位数,使用/dev/urandom保证随机数均匀性:
#!/bin/bash # 配置参数:最小值、最大值、小数位数 ug_rnd=0 og_rnd=10 decimal_digits=2 # 可修改为5等其他位数,需要几位小数就填几 # 计算放大倍数:10的decimal_digits次方 scale=1 for ((i=0;i<decimal_digits;i++)); do scale=$((scale * 10)) done # 计算放大后的取值总区间长度 total_range=$(( (og_rnd * scale) - (ug_rnd * scale) + 1 )) # 生成均匀分布的大随机整数 rnd="$((0x$(dd if=/dev/urandom of=/dev/stdout bs=4 count=1 status=none | xxd -p)))" scaled_rnd=$(( rnd % total_range + ug_rnd * scale )) # 拼接为最终小数格式 if [ $decimal_digits -eq 0 ]; then my_rnd="$scaled_rnd" else integer_part=$(( scaled_rnd / scale )) decimal_part=$(( scaled_rnd % scale )) # 小数位前面自动补0,保证位数符合要求 printf -v decimal_part "%0${decimal_digits}d" "$decimal_part" my_rnd="${integer_part}.${decimal_part}" fi # 输出结果,也可直接传入sleep等命令使用 echo "$my_rnd" sleep "$my_rnd"
参数调整说明
- 修改取值范围:直接调整
ug_rnd(最小值)和og_rnd(最大值)即可 - 修改小数位数:调整
decimal_digits参数即可,比如要5位小数就设为decimal_digits=5
注意:生成的小数是字符串格式,无需额外转换即可直接传入
sleep等原生支持小数参数的bash命令使用。
内容的提问来源于stack exchange,提问作者Alfred.37
相关产品推荐
相关产品推荐

