如何在shell脚本中使用随机数?

时间:2017-07-16 07:09:14

标签: shell random

使用shell脚本,我希望生成五个文件,并希望在每个文件中放置50000~150000的不同随机数范围。我尝试了类似的事情,

for i in 01 02 03 04 05; do
A=$((50000+100000))
B=$(($B%$A))
cat > ${i}.dat << EOF
AArandom=$A
EOF
done

但这不起作用....如何为每个文件制作随机数字并打印出来?

2 个答案:

答案 0 :(得分:5)

每次读取变量$RANDOM的值时, 它会为您提供0到2^15 - 1之间的随机数, 这是0和32767.所以这不会给你足够的范围。 您可以使用两个$RANDOM作为base-15的两位数, 然后采用适当的模数并应用适当的范围归一化。

这是包含在函数中的逻辑:

randrange() {
    min=$1
    max=$2

    ((range = max - min))

    ((maxrand = 2**30))
    ((limit = maxrand - maxrand % range))

    while true; do
        ((r = RANDOM * 2**15 + RANDOM))
        ((r < limit)) && break
    done

    ((num = min + r % range))
    echo $num
}

然后你可以像这样循环生成文件:

for i in 01 02 03 04 05; do
  echo "AArandom=$(randrange 50000 150000)" > $i.dat
done

请注意,randrange的实施需要注意: 如果值有偏差,有一个循环重新滚动, 但理论上这可能会阻止函数终止。 在实践中,这是极不可能的,但值得一提。

答案 1 :(得分:1)

shuf可能就是你想要的:

$ shuf -i 50000-150000 -n 1
148495