Немного погуглив, я не смог найти простой способ использовать команду оболочки для генерации случайного десятичного целого числа, включенного в определенный диапазон, то есть между минимумом и максимумом.
Я читал о /dev/random
, /dev/urandom
и $RANDOM
, но ни один из них не может сделать то, что мне нужно.
Есть ли другая полезная команда или способ использовать предыдущие данные?
shell
command-line
command
random
BowPark
источник
источник
Ответы:
В инструментарии POSIX вы можете использовать
awk
:Как не использовать его в качестве источника для генерации паролей или секретные данные , например, как и в большинстве
awk
реализаций, число легко можно догадаться на основе времени эта команда была запущена.Во многих
awk
реализациях эта команда, запускаемая дважды в течение одной и той же секунды, обычно дает одинаковый результат.источник
x=$(awk -v min=$min_var -v max=$max_var 'BEGIN{srand(); printf("%.2d", int(min+rand()*(max-min+1)))}')
awk -v min=5 -v max=10 -v seed="$(od -An -N4 -tu4 /dev/urandom)" 'BEGIN{srand(seed+0); print int(min+rand()*(max-min+1))}'
. Вы можете использовать$RANDOM
вместо,od ... /dev/random
но тогда ваше начальное значение находится в относительно небольшом диапазоне от 0 до 32767, и, таким образом, вы, вероятно, получите заметные повторения в выходных данных со временем.Вы можете попробовать
shuf
из GNU coreutils:источник
shuf
.йота
В BSD и OSX вы можете использовать jot для возврата единственного числа random (
-r
) из интервалаmin
вmax
включительно.Проблема распределения
К сожалению, на диапазон и распределение случайно сгенерированных чисел влияет тот факт, что jot внутренне использует арифметику с плавающей запятой двойной точности и printf (3) для формата вывода, что вызывает проблемы с округлением и усечением. Поэтому интервалы
min
иmax
генерируются реже, как показано:На OS X 10.11 (El Capitan) это, кажется, было исправлено:
а также...
Решение проблемы распределения
Для более старых версий OS X, к счастью, есть несколько обходных путей. Одним из них является использование printf (3) целочисленного преобразования. Единственное предостережение в том, что максимальный интервал теперь становится
max+1
. Используя целочисленное форматирование, мы получаем справедливое распределение по всему интервалу:Идеальное решение
И, наконец, чтобы получить правильное бросок костей с помощью обходного пути, мы имеем:
Дополнительная домашняя работа
См. Jot (1) для подробной информации о математике и форматировании, а также многих других примеров.
источник
$RANDOM
Переменный обычно не является хорошим способ генерируемых хороших случайных значений. Выходные данные/dev/[u]random
необходимо также преобразовать в первую очередь.Проще всего использовать языки более высокого уровня, например, python:
Чтобы сгенерировать случайную целочисленную переменную от 5 до 10 (5 <= N <= 10), используйте
Не используйте это для криптографических приложений.
источник
Вы можете получить случайное число через
urandom
head -200 /dev/urandom | cksum
Выход:
3310670062 52870
Чтобы получить одну часть вышеуказанного номера.
head -200 /dev/urandom | cksum | cut -f1 -d " "
Тогда вывод
3310670062
источник
head -200
(или его эквивалент POSIXhead -n 100
) возвращает первые 200 строк из/dev/urandom
./dev/urandom
это не текстовый файл, эта команда может возвращать от 200 байтов (все 0x0a, LF в ASCII) до бесконечности (если байт 0xa никогда не возвращается), но значения между 45k и 55k являются наиболее вероятными. cksum возвращает 32-битное число, поэтому бессмысленно получать более 4 байтов/dev/urandom
.Чтобы сгенерировать случайную целочисленную переменную от 5 до 10 (включая оба), используйте
%
работает как оператор по модулю.Вероятно, есть более эффективные способы преобразования случайной величины
$RANDOM
в определенный диапазон. Не используйте это для криптографических приложений или в случаях, когда вам нужны реальные, равномерно распределенные случайные величины (например, для моделирования).источник
# echo $(( $RANDOM % 256 ))
выдаст «случайное» число от 0 до 255 на современных диалектах.источник
Может быть
UUID
(в Linux) можно использовать для получения случайного числаЧтобы получить случайное число между
70
и100
источник
Это сгенерирует шестнадцатеричное число длиной 8 цифр.
источник
Чтобы полностью остаться в bash и использовать переменную $ RANDOM, но избегайте неравномерного распределения:
Этот пример предоставит случайные числа от 20 до 29.
источник
$r
следует инициализировать до 65535 или другого высокого значения, чтобы избежать[: -lt: unary operator expected
ошибки.Распределение это хорошо:
for ((i = 1; i <= 100000; i ++)) do echo $ ((RANDOM% (20 - 10 + 1) + 10)); сделано | сортировать -n | uniq -c
значение счета
9183 10
9109 11
8915 12
9037 13
9100 14
9138 15
9125 16
9261 17
9088 18
8996 19
9048 20
источник