使用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)
但这不起作用....如何为每个文件制作随机数字并打印出来?
每次读取变量的值时$RANDOM
,它会给出一个介于0和2^15 - 1
0 之间的随机数,即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
:如果值有偏差,则有一个循环重新滚动,但理论上这可能会阻止函数终止.在实践中,这是极不可能的,但值得一提.