如何在Bash中生成一个范围内的随机数?
当前回答
从/dev/random或/dev/urandom字符特殊文件读取是可行的方法。
这些设备在读取和设计时返回真正的随机数 帮助应用软件选择用于加密的安全密钥。这样的 随机数是从熵池中提取的 通过各种随机事件。{LDD3,乔纳森·科贝,亚历山德罗 Rubini和Greg Kroah-Hartman]
这两个文件是内核随机化的接口
void get_random_bytes_arch(void* buf, int nbytes)
它从硬件中抽取真正随机的字节,如果这样的功能是由硬件实现的(通常是),或者它从熵池中抽取(包括事件之间的时间,如鼠标和键盘中断,以及注册在SA_SAMPLE_RANDOM中的其他中断)。
dd if=/dev/urandom count=4 bs=1 | od -t d
这是可行的,但将不需要的输出从dd写入到stdout。下面的命令给出了我需要的整数。我甚至可以得到指定的随机位数,因为我需要调整位掩码给算术展开:
me@mymachine:~/$ x=$(head -c 1 /dev/urandom > tmp && hexdump
-d tmp | head -n 1 | cut -c13-15) && echo $(( 10#$x & 127 ))
其他回答
基于@Nelson, @Barun和@Robert的精彩回答,这里有一个生成随机数的Bash脚本。
可以生成你想要的数字。 每个数字都是由/dev/urandom单独生成的,这比Bash内置的$RANDOM要好得多
#!/usr/bin/env bash
digits=10
rand=$(od -A n -t d -N 2 /dev/urandom |tr -d ' ')
num=$((rand % 10))
while [ ${#num} -lt $digits ]; do
rand=$(od -A n -t d -N 1 /dev/urandom |tr -d ' ')
num="${num}$((rand % 10))"
done
echo $num
这里有$RANDOM。 我不知道具体是怎么回事。但它确实有效。 对于测试,您可以执行:
echo $RANDOM
bash 5.1引入了一个新变量SRANDOM,它从系统的熵引擎中获取随机数据,因此它不是线性的,不能重新种子以获得相同的随机序列。这个变量可以用来代替RANDOM来生成更多的随机数。
$ echo $((1 + SRANDOM % 10))
4
也可以从awk中获取随机数
awk 'BEGIN {
# seed
srand()
for (i=1;i<=1000;i++){
print int(1 + rand() * 100)
}
}'
生成随机的3位数字
这对于创建示例数据非常有用。示例:将所有测试数据放在名为“test-create-volume-123”的目录中,然后在测试完成后,删除整个目录。通过生成恰好三个数字,就不会有奇怪的排序问题。
printf '%02d\n' $((1 + RANDOM % 100))
这是按比例缩小的,例如到一个数字:
printf '%01d\n' $((1 + RANDOM % 10))
它可以放大,但只能放大到四位数。原因见上文:)