如何在bash中生成0到1之间的随机数

时间:2016-02-06 16:44:03

标签: bash shell random

我试图在下面的bash命令中推断如何生成两个随机数作为readproportionupdateproportion参数的输入值,其方式是这些参数的总和应该等于1。

$ ./bin/ycsb run basic -P workloads/workloada -p readproportion=0.50 -p updateproportion=0.50

请帮助您提出建议。

由于

6 个答案:

答案 0 :(得分:3)

据我所知,$ {RANDOM}在0 - 32767区间内生成整数。所以,我想,你可能想尝试这样的东西在[0,1]中生成随机值:

bc -l <<< "scale=4 ; ${RANDOM}/32767"

答案 1 :(得分:2)

$ arr=( $(awk 'BEGIN{srand(); r=rand(); print r, 1-r}') )
$ echo "${arr[0]}"
0.661624
$ echo "${arr[1]}"
0.338376

$ arr=( $(awk 'BEGIN{srand(); r=rand(); printf "%.2f %.2f\n", r, 1-r}') )
$ echo "${arr[0]}"
0.74
$ echo "${arr[1]}"
0.26

srand()每秒只更新一次种子,但只要您不需要每秒更频繁地调用脚本,就应该没问题。

答案 2 :(得分:1)

罗伯特J的想法:

RANDOM=$$                      # Reseed using script's PID
r1=$((${RANDOM}%98+1))
r2=$((100-$r1))
printf -v r1 "0.%.2d" $r1
printf -v r2 "0.%.2d" $r2
echo "$r1 $r2"

输出(例如):

0.66 0.34
0.01 0.99
0.42 0.58
0.33 0.67
0.22 0.78
0.33 0.67
0.65 0.35
0.77 0.23
0.71 0.29

答案 3 :(得分:0)

这是一种超级简单的方法:

move

^^不要使用和阅读以下^^

编辑:

我看不懂:

var map = new L.Map('leaflet', {
    'center': [52.378333, 4.9],
    'zoom': 12,
    'layers': [
        L.tileLayer('//{s}.basemaps.cartocdn.com/light_all/{z}/{x}/{y}.png', {
            attribution: '&copy; <a href="http://www.openstreetmap.org/copyright">OpenStreetMap</a> contributors, &copy; <a href="http://cartodb.com/attributions">CartoDB</a>'
        })
    ]
});

var marker = new L.Marker(map.getCenter()).addTo(map);

map.on('move', function () {
    marker.setLatLng(this.getCenter());
});

编辑2:

正如所指出的那样,第一次迭代是可怕的。一旦我完全阅读了这个问题并尝试使用&#34;数字&#34;进行一些简单的数学运算。我意识到这是超级破碎的。您可以在以下网址阅读更多信息:

http://www.tldp.org/LDP/abs/html/randomvar.html - 和 - https://www.shell-tips.com/2010/06/14/performing-math-calculation-in-bash/

答案 4 :(得分:0)

这是“浪费”(它只是丢弃字符,直到 /dev/urandom 碰巧吐出足够多的 ascii 09 s),但它是安全的伪随机:

rand_frac() { echo -n 0.; LANG=C tr -dc 0-9 </dev/urandom | head -c12; }

然后,你可以

$ echo The random number is.... $(rand_frac)
The random number is.... 0.413856349581

LANG=C 用于防止 tr 因来自 /dev/urandom 的错误 UTF-8 序列而窒息。 -dc 表示d删除后续字符类的c补充(因此,删除除 0-9 之外的所有内容)。

您可以更改 0-9 以生成任意字符类,或将 head -c 12 调整为其他内容,这对于制作密码很有用。

答案 5 :(得分:0)

这很好用

$ bc -l <<< "scale=16; $(od -t u2 -An -N2 /dev/random)/(2 ^ 16)"
.2792053222656250