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

exs*_*c01 0 random shell

使用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
Run Code Online (Sandbox Code Playgroud)

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

Sto*_*ica 5

每次读取变量的值时$RANDOM,它会给出一个介于0和2^15 - 10 之间的随机数,即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
}
Run Code Online (Sandbox Code Playgroud)

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

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

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