jot
No BSD e OSX você pode usar jot para retornar um único número aleatório ( -r
) do intervalo min
para max
, inclusive.
$ min=5
$ max=10
$ jot -r 1 $min $max
Problema de distribuição
Infelizmente, o intervalo e a distribuição de números gerados aleatoriamente são influenciados pelo fato de que jot usa aritmética de ponto flutuante de precisão dupla internamente e printf (3) para formato de saída, o que causa problemas de arredondamento e truncamento. Portanto, os min
e max
do intervalo são gerados com menos frequência, conforme demonstrado:
$ jot -r 100000 5 10 | sort -n | uniq -c
9918 5
20176 6
20006 7
20083 8
19879 9
9938 10
No OS X 10.11 (El Capitan) isso parece ter sido corrigido:
$ jot -r 100000 5 10 | sort -n | uniq -c
16692 5
16550 6
16856 7
16579 8
16714 9
16609 10
e ...
$ 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
Resolvendo o problema de distribuição
Para versões mais antigas do OS X, felizmente existem várias soluções alternativas. Uma é usar a conversão inteira de printf (3). A única ressalva é que o intervalo máximo agora se torna max+1
. Usando a formatação inteira, obtemos uma distribuição justa em todo o intervalo:
$ jot -w %i -r 100000 5 11 | sort -n | uniq -c
16756 5
16571 6
16744 7
16605 8
16683 9
16641 10
A solução perfeita
Por fim, para obter um resultado justo usando a solução alternativa, temos:
$ min=5
$ max_plus1=11 # 10 + 1
$ jot -w %i -r 1 $min $max_plus1
Tarefa extra
Veja jot (1) para os detalhes de matemática e formatação sangrentos e muitos outros exemplos.