例如,
echo "$(( ($(od -An -N2 -i /dev/random) )%(1000-0+1) ))"
可以使用。但是对于更大的数字不具备可扩展性。
如何在bash中获取0到999999999之间的随机(/dev/random)数?
我建议使用:
shuf -i0-999999999 -n1
shuf
使用/dev/random
。如果您确实想要,可以通过GNU shuf
指定--random-source=/dev/random
。shuffle
,并且它需要略微不同的参数(shuffle -n1000000000 -p1
)。/dev/random
,则可以通过使用od -An -N4 -tu4
生成一个四字节数字,但请记住,使用%1000000000
会产生偏差,因为232不能被1000000000
整除。为了纠正这个问题,在生成0-999999999
范围内的随机数的特定情况下,如果四字节随机数大于或等于4000000000
,则需要拒绝该数字。解释
使用 /dev/random
的关键在于思考如何产生均匀分布。 /dev/random
可以实现,但是需要注意:
od -An -N2 -i /dev/random
while :; do ran=$(echo $(od -An -N1 -i /dev/random)) && [[ $ran -lt 250 ]] && \
echo ${ran: -1} && break; done
由于0...249的最低有效数字的分布是均匀的,因此可以构建一个9位随机数,只需执行以下操作:
然后构建一个9位随机数,只需执行以下操作:
#!/bin/bash
digit() {
while :; do ran=$(echo $(od -An -N1 -i /dev/random)) && [[ $ran -lt 250 ]] && \
echo ${ran: -1} && break; done
}
for ((i=0; i<9; i++)) {
num+=$(digit)
}
echo $num
cat /dev/random | tr -cd 0-9 | dd bs=1 count=9
/dev/random
中获取随机数据,删除除0
、1
、... 9
之外的所有内容;然后使用dd仅等待9个数字。您可以使用 awk
,它应该在几乎所有类UNIX系统上都可用:
awk 'BEGIN{print int(rand()*999999999)}'
/dev/random
? - adrelanossrand()
的方法用于种子生成器,这意味着伪随机生成器。strace -eopen awk 'BEGIN{print int(rand()*999999999)}'
也没有显示打开/dev/random
。但是,您可以从/dev/random/
读取一些数据来使用srand()
种子伪随机数生成器。虽然这不如直接使用/dev/random
好,但仍然可行。 - Michał Kosmulski
/ dev / random
不是那么随机,因此它会出错,但它已经损坏了,所以... :D - Benjamin Gruenbaum