经过一番谷歌搜索后,我找不到一种简单的方法来使用 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
之间的单个随机 ( ) 数(含)。min
max
$ 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