йота
В BSD и OSX вы можете использовать jot для возврата единственного числа random ( -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
Дополнительная домашняя работа
См. Jot (1) для подробной информации о математике и форматировании, а также многих других примеров.