记下

记下

经过一番谷歌搜索后,我找不到一种简单的方法来使用 shell 命令生成包含在特定范围(即最小值和最大值之间)的随机十进制整数。

我读到了/dev/random/dev/urandom$RANDOM,但这些都不能满足我的需要。

还有其他有用的命令,或者使用以前的数据的方法吗?

答案1

您可以尝试shuf使用 GNU coreutils:

shuf -i 1-100 -n 1

答案2

在 POSIX 工具箱中,您可以使用awk

awk -v min=5 -v max=10 'BEGIN{srand(); print int(min+rand()*(max-min+1))}'

不是例如,使用它作为生成密码或秘密数据的源,与大多数awk实现一样,可以根据命令运行的时间轻松猜出该数字。

对于许多awk实现,该命令在同一秒内运行两次通常会给出相同的输出。

答案3

记下

在 BSD 和 OSX 上您可以使用记下返回到-r之间的单个随机 ( ) 数(含)。minmax

$ min=5
$ max=10
$ jot -r 1 $min $max

分配问题

不幸的是,随机生成的数字的范围和分布受到 jot 内部使用双精度浮点运算和 printf(3) 作为输出格式这一事实的影响,这会导致舍入和截断问题。因此,间隔min和的max生成频率较低,如下所示:

$ jot -r 100000 5 10 | sort -n | uniq -c
9918  5
20176 6
20006 7
20083 8
19879 9
9938  10

在 OS X 10.11 (El Capitan) 上,此问题似乎已得到修复:

$ jot -r 100000 5 10 | sort -n | uniq -c
16692 5
16550 6
16856 7
16579 8
16714 9
16609 10  

和...

$ jot -r 1000000 1 10 | sort -n | uniq -c
100430 1
99965 2
99982 3
99796 4
100444 5
99853 6
99835 7
100397 8
99588 9
99710 10

解决分配问题

幸运的是,对于旧版本的 OS X,有几种解决方法。一种是使用 printf(3) 整数转换。唯一需要注意的是,间隔最大值现在变为max+1。通过使用整数格式,我们可以在整个区间内得到公平的分布:

$ jot -w %i -r 100000 5 11 | sort -n | uniq -c
16756 5
16571 6
16744 7
16605 8
16683 9
16641 10

完美的解决方案

最后,为了使用解决方法获得公平的骰子,我们有:

$ min=5
$ max_plus1=11  # 10 + 1
$ jot -w %i -r 1 $min $max_plus1

额外的作业

笔记(1)了解血淋淋的数学和格式细节以及更多示例。

答案4

您可以通过以下方式获取随机数urandom

head -200 /dev/urandom | cksum

输出:

3310670062 52870

检索上述数字的一部分。

head -200 /dev/urandom | cksum | cut -f1 -d " "

那么输出是

3310670062

相关内容