如何在Bash中生成指定范围内的随机数?
$RANDOM
。它通常与简单的shell算术结合使用非常有用。例如,要生成一个介于1和10之间(包括1和10)的随机数:$ echo $((1 + $RANDOM % 10))
3
variables.c
中,函数brand()
。旧版本是一个简单的线性生成器。版本4.0的bash
使用一个带有引用的生成器来一篇1988年的论文,这可能意味着它是一个不错的伪随机数源。我不会将其用于模拟(当然也不会用于加密),但对于基本的脚本任务来说,它可能是足够的。/dev/random
或/dev/urandom
(如果可用):$ dd if=/dev/urandom count=4 bs=1 | od -t d
Random
这样的随机库提供了函数,可以正确地返回给定范围内的均匀随机数,而不仅仅是取非可被整除的数的模。 - dimo414(())
中,你可以省略变量的前缀$
,像这样 $((1 + RANDOM % 10))
。 - LianSheng$RANDOM
:
$RANDOM
是一个Bash内部函数(不是常量),返回0-32767范围内的伪随机整数。不应用于生成加密密钥。
32767
是有符号 16 位整数的上限,其值为 2^16 / 2 - 1
。 - Jeffrey Martinez你也可以使用 shuf
(在coreutils中可用)。
shuf -i 1-100000 -n 1
$var
添加到范围末尾,像这样:var=100 && shuf -i 1-${var} -n 1
。 - knipwimshuf -i 1-100 -n 5
- aerijmanshuf -i 1-10 -n 10
,你将会得到所有从1到10的数字正好一次。如果你指定 -n 15
,你仍然只会得到那十个数字且每个数字只有一次。这只是简单的洗牌,而非生成随机数。 - radlanshuf
不使用密码学安全的伪随机数生成器,但可以使用 /dev/urandom
(--random-source
选项)与 shuf
一起使用。相关链接:https://unix.stackexchange.com/a/705633/133353(*默认情况下,这些命令使用内部的伪随机发生器进行初始化*...) - Artfaith尝试在您的Shell中执行此操作:
$ od -A n -t d -N 1 /dev/urandom
-t d
指定输出格式应为有符号十进制;-N 1
表示从/dev/urandom
读取一个字节。od -A n -t d -N 1 /dev/urandom |tr -d ' '
- Robert$RANDOM
一样,它们不以10的倍数结束,如果使用模运算可能会导致偏差。因此,使用1个字节最多可以达到255,因此使用%10会使某些数字具有比其他数字更高的概率。2个字节、3个字节等也是如此。 - Pier A我喜欢这个技巧:
echo ${RANDOM:0:1} # random number between 1 and 9
echo ${RANDOM:0:2} # random number between 1 and 99
...
${RANDOM:0:1}
有67.8%的几率给你一个1或2,${RANDOM:0:2}
只有0.03%的几率给你一个单个数字(应该是1%),两者都有0.003%的几率给你一个0。仍然有使用情况可以接受(例如不一致输入)。 - jbo5112echo $((10#${RANDOM: -1}${RANDOM: -1}))
它每次使用最后一位数字,并且去掉前导零。如果需要更多位数,只需添加一个额外的 ${RANDOM: -1}
。 - undefined你也可以从awk中获取随机数
awk 'BEGIN {
# seed
srand()
for (i=1;i<=1000;i++){
print int(1 + rand() * 100)
}
}'
srand()
函数的种子值是当前CPU时间。如果需要指定特定的种子值,以便能够复制随机数生成器 (RNG) 的结果,请使用 srand(x)
,其中 x
是种子值。此外,引用自GNU awk数学函数手册,“不同的awk实现在内部使用不同的随机数生成器。” 结果是,如果你希望生成统计分布,应该预期在不同平台上运行awk
或gawk
时,在一个运行时和下一个运行时之间会有轻微的变化。 - Cbhihesrand()
使用当前CPU时间的秒数作为种子,因此如果您在同一秒内运行此脚本多次,则脚本每次都会打印相同的值。如果您想要更安全,那么只需将 srand()
替换为 srand('$(date +%s%N)')
,以使用当前纳秒级别的时间(写作时,macOS不支持该函数,但Linux应该可以)。 - Brandon这里是 $RANDOM。我不确切知道它是如何工作的,但它可以使用。对于测试,您可以执行:
echo $RANDOM
$(( ($RANDOM % 10) + 1 ))
- sherrellbc0到9之间(包括0和9)的随机数。
echo $((RANDOM%10))
$RANDOM
只能生成从0到32767之间的随机数。它应该说“大多数情况下生成1到3之间的随机数,偶尔会有一些异常值” ;) - David Newcomb$ RANDOM=$(date +%s%N | cut -b10-19 | sed 's|^[0]\+||')
$ echo $(( $RANDOM % 113 + 13 ))
0
交换呢?也就是说,这本来不应该发生吧? - Roel Van de Paarsed
(一个单独的程序):${RANDOM#0}
。 - legends2kRANDOM=...
的赋值上。我已经修复了答案,使用sed
命令加入了一个0
修复。 - Roel Van de PaarRANDOM
赋值,而不需要使用前导零来初始化随机数生成器。使用另一个变量也是一种选择:在线示例;虽然多了一行代码,但不需要额外的进程。感谢你的答案和链接 :) - legends2k