9.6. $RANDOM: генерация псевдослучайных целых чисел
$RANDOM — внутренняя функция Bash (не константа), которая возвращает псевдослучайные целые числа в диапазоне 0 — 32767. Функция $RANDOM не должна использоваться для генераци ключей шифрования.
Пример 9-23. Генерация случайных чисел
Пример 9-24. Выбор случайной карты из колоды
Jipe подсказал еще один способ генерации случайных чисел из заданного диапазона.
Насколько случайны числа, возвращаемые функцией $RANDOM? Лучший способ оценить «случайность» генерируемых чисел — это написать сценарий, который будет имитировать бросание игрального кубика достаточно большое число раз, а затем выведет количество выпадений каждой из граней.
Пример 9-25. Имитация бросания кубика с помощью RANDOM
Как видно из последнего примера, неплохо было бы производить переустановку начального числа генератора случайных чисел RANDOM перед тем, как начать работу с ним. Если используется одно и то же начальное число, то генератор RANDOM будет выдавать одну и ту же последовательность чисел. (Это совпадает с поведением функции random() в языке C.)
Пример 9-26. Переустановка RANDOM
Системный генератор /dev/urandom дает последовательность псевдослучайных чисел с более равномерным распределением, чем $RANDOM. Команда dd if=/dev/urandom of=targetfile bs=1 count=XX создает файл, содержащий последовательность псевдослучайных чисел. Однако, эти числа требуют дополнительной обработки, например с помощью команды od (этот прием используется в примере выше) или dd (см. Пример 12-42).
Есть и другие способы генерации псевдослучайных последовательностей в сценариях. Awk имеет для этого достаточно удобные средства.
Пример 9-27. Получение псевдослучайных чисел с помощью awk
Источник
Generating Random Numbers in Linux Shell Scripting
There will be cases wherein you need something to be random: a random number, a random sequence of characters, a random file name, or a random password. For this purpose, you need to know the methods that will help you generate the random thing you need. Randomization will be the subject of our talk today. An interesting topic it is really, so, enjoy.
Random Number Generation
1) Using the Random Variable
To generate a random number in a UNIX or Linux shell, the shell maintains a shell variable named RANDOM. Each time this variable is read, a random number between 0 and 32767 is generated.
To enhance the randomization process, the RANDOM variable should be initialized (seeded) to an initial value (like the process ID of the current shell, which is maintained by the variable $$)
Example You need to generate 10 random numbers. How would you achieve this?
Consider the following script:
Let’s execute it to see what we will get:
Generating Random Numbers within a Range To generate a random number in a specific range using the RANDOM variable, an intelligent trick is used. Consider we need to generate a random number that is less than an integer number Y. To do so, we use the following formula:
If the range of possible numbers should include its upper limit Y, the divisor of the modulo operation should be Y+1.
Now the generated number will be between 0 and Y, inclusively. If the generated number should be located between X and Y inclusively, where X is a non-zero integer, the formula becomes:
Example The following script will accept two integers as command-line arguments and generate 5 random integers between them, inclusively.
Would this code achieve what we need?! Let’s see:
It worked as expected. Now, we need to explain things:
Line 6: checks the number of provided command-line arguments. If the number of arguments is not 2, a usage message is printed, and the script exits with exit code 1.
Line 10: the lines from this until the end of the program are executed in case the user has provided the correct number of arguments (2). This line calculates the difference between the maximum and minimum range values and adds 1 to include the maximum value.
Line 11: this line initializes the RANDOM variable to the process ID of the shell.
Line 12: starts a for loop with a loop variable i, which loops on values from 1 to 5 (five iterations).
Lines 13 and 16: the loop body delimiters.
Line 14: calculates the random number from the required range according to the formula above.
Line 15: displays the generated number.
2) Using the shuf Command Another way to generate random numbers in Linux shell is by using the shuf command. This command (according to its manual page) generates random permutations and displays them one per line.
Syntax
Where: MIN and MAX are the lower and upper limits of the range of numbers, respectively. COUNT is the number of lines (random numbers) to display.
Example The following command will generate 10 random integers from the range between 0 and 1000
When executed, it should give an output like the following:
3) Using /dev/random The /dev/random special device file can be used to generate random numbers. The idea is simple: The /dev/random uses the noise collected from the device drivers and other sources to generate random data. The od (octal dump) command can extract a number of bytes and displays their decimal equivalent. That is it!!
To get one random byte (0 – 255) and display it in decimal format:
When put inside a loop that iterates 5 times:
Similarly, to get 2 bytes (0 – 65535):
To get a larger number, increase the number of bytes to convert (the number following the –N option)
Summary
Generating random data may be useful in some cases.
To generate a random number using UNIX/Linux shell, there are several methods.
The shell maintains a shell variable RANDOM that gives a random number between 0 and 32767 each time it is read.
Using the shuf command, we can get a list of random numbers, each printed in a separate line.
The /dev/random special file generates random data. Together with the od command, they could be used to generate random numbers.
In the next article, we are going to learn how to generate random data and random passwords.
Meanwhile, If you are a beginner and want to gain in-depth knowledge about the subject, try the “Linux Shell Programming for Beginners” course. The course comes with 9.5 hours of video that covers 12 sections such as command lines and tips, customizing your shell, conditions and loops, command-line options, and much more.
Источник
Как сгенерировать случайное число в Bash?
Как сгенерировать случайное число в диапазоне в Bash?
Использование $RANDOM . Это часто полезно в сочетании с простой арифметикой оболочки. Например, чтобы сгенерировать случайное число от 1 до 10 (включительно):
Фактический генератор в variables.c функции brand() . Старые версии были простым линейным генератором. Версия 4.0 bash использует генератор с цитатой к статье 1985 года, что, вероятно, означает, что это достойный источник псевдослучайных чисел. Я бы не использовал его для симуляции (и уж точно не для криптографии), но, вероятно, он подходит для базовых задач сценариев.
Если вы делаете что-то, что требует серьезных случайных чисел, которые вы можете использовать /dev/random или /dev/urandom если они доступны:
$RANDOM является внутренней функцией Bash (не константой), которая возвращает псевдослучайное целое число в диапазоне от 0 до 32767. Она не должна использоваться для генерации ключа шифрования.
Вы также можете использовать shuf (доступно в coreutils).
Попробуйте это из вашей оболочки:
Здесь -t d указывает, что формат вывода должен быть десятичным со знаком; -N 1 говорит прочитать один байт от /dev/urandom .
вы также можете получить случайное число из awk
Есть $ RANDOM. Я не знаю точно, как это работает. Но это работает. Для тестирования вы можете сделать:
Мне нравится этот трюк:
Случайное число от 0 до 9 включительно.
Если вы используете систему Linux, вы можете получить случайное число из / dev / random или / dev / urandom. Будьте осторожны / dev / random будет блокировать, если недостаточно доступных случайных чисел. Если вам нужна скорость по случайности, используйте / dev / urandom.
Эти «файлы» будут заполнены случайными числами, сгенерированными операционной системой. Это зависит от реализации / dev / random в вашей системе, если вы получите истинные или псевдослучайные числа. Истинные случайные числа генерируются с помощью шума, получаемого от драйверов устройств, таких как мышь, жесткий диск, сеть
Вы можете получить случайные числа из файла с дд
Я взял несколько из этих идей и создал функцию, которая должна быстро работать, если требуется много случайных чисел.
звонить od дорого, если вам нужно много случайных чисел. Вместо этого я вызываю его один раз и сохраняю 1024 случайных числа из / dev / urandom. Когда rand вызывается, последнее случайное число возвращается и масштабируется. Затем он удаляется из кэша. Когда кеш пуст, читаются еще 1024 случайных числа.
Возвращает случайное число в RET от 0 до 9 включительно.
ОБНОВЛЕНИЕ: Это не работает так хорошо для всех N. Это также тратит впустую случайные биты, если используется с маленьким N. Отметив, что (в этом случае) 32-битное случайное число имеет достаточно энтропии для 9 случайных чисел от 0 до 9 (10 * 9 = 1 000 000 000 — philcolbourn источник
Чтение из специальных файлов символов / dev / random или / dev / urandom — это лучший способ.
Эти устройства возвращают действительно случайные числа при чтении и разработаны, чтобы помочь прикладному программному обеспечению выбрать безопасные ключи для шифрования. Такие случайные числа извлекаются из пула энтропии, который вносится различными случайными событиями.
Эти два файла являются интерфейсом для рандомизации ядра, в частности
который извлекает действительно случайные байты из аппаратного обеспечения, если такая функция реализована аппаратным обеспечением (обычно таковым является), или извлекает из пула энтропии (состоящего из временных интервалов между событиями, такими как прерывания мыши и клавиатуры и другие прерывания, которые зарегистрированы в SA_SAMPLE_RANDOM).
Это работает, но записывает ненужные выходные данные dd в stdout. Команда ниже дает только целое число, которое мне нужно. Я даже могу получить указанное количество случайных битов, сколько мне нужно, путем настройки битовой маски, данной арифметическому расширению:
Источник
Сгенерировать случайное число в bash
Главное меню » Linux » Сгенерировать случайное число в bash
Использование случайного генератора:
Случайное число или диапазон случайных чисел можно сгенерировать с помощью переменной $RANDOM. По умолчанию он генерирует случайное число от 0 до 32767. Но вы можете установить диапазон чисел для генерации случайных чисел, разделив значение $RANDOM на определенное значение. Различные варианты использования переменной $RANDOM для генерации случайных чисел показаны в следующей части статьи.
Генерация случайных чисел с использованием переменной $RANDOM:
Здесь показаны способы генерации случайного числа в терминале и выполнения файла сценария.
A. Генерация случайных чисел с терминала
Выполните следующую команду, чтобы сгенерировать случайное число в диапазоне от 0 до 32767.
Вы можете сгенерировать случайное число из определенного диапазона, разделив переменную $RANDOM на определенное значение и получив оставшееся значение. Выполните следующую команду, чтобы сгенерировать случайное число в диапазоне от 1 до 50. Здесь используются двойные первые скобки с символом $.
Выполните следующую команду, чтобы сгенерировать случайное число в диапазоне от 10 до 40. Здесь использовалась третья скобка с символом $.
Б. Генерация случайных чисел с помощью скрипта
Создайте файл bash с помощью следующего сценария, чтобы сгенерировать случайное число из определенного диапазона, где минимальное и максимальное значения диапазона будут взяты от пользователя. Сообщение об ошибке будет отображаться, если взятое максимальное значение меньше минимального значения. Если разница между максимальным и минимальным значением равна 1, отобразится другое сообщение об ошибке. Случайное число будет генерироваться при каждом выполнении этого скрипта, если в качестве входных данных будут приняты допустимые минимальное и максимальное значения.
Следующий вывод появится, если сценарий выполняется несколько раз. Здесь приведенный выше сценарий был выполнен трижды. Сообщение об ошибке было напечатано для первых двух выполнений из-за недопустимого ввода, а для последнего выполнения было сгенерировано случайное число.
Генерация случайных чисел с помощью команды shuf:
Использование команды `shuf` – еще один способ сгенерировать случайное число из определенного диапазона. В этой статьи были показаны способы генерации случайного числа из терминала и использования сценария.
A. Генерация случайных чисел с терминала
Выполните следующую команду, чтобы сгенерировать случайное число от 0 до 50 с помощью команды `shuf`.
Согласно следующему выводу, указанная выше команда была выполнена три раза, и были сгенерированы три случайных числа.
Б. Генерация случайных чисел с помощью скрипта
Создайте файл bash со следующим сценарием для создания списка случайных чисел на основе входного значения. Цикл for использовался для многократного выполнения команды`shuf`, чтобы сгенерировать список случайных чисел от 1 до 100 и распечатать числа.
Следующие выходные данные показывают, что 5 было принято в качестве входного значения и было сгенерировано 5 случайных чисел, которые не больше 100 и не меньше 1.
Генерация случайных чисел с помощью /dev/urandom:
/dev/urandom можно использовать с разными командами для генерации разных типов случайных значений. Его нельзя использовать для указания значений диапазона, таких как команда shuf и переменная $RANDOM. Но количество цифр случайного числа можно определить в команде с помощью /dev/urandom. Использование команды od с /dev/urandom показано в следующей части этого руководства. Эта команда может использоваться для указания количества байтов, где каждый байт может быть определен десятичным числом от 0 до 255.
Выполните следующую команду, чтобы сгенерировать случайное число от 0 до 255.
Выходные данные показывают, что указанная выше команда была выполнена три раза, и здесь были сгенерированы три разных случайных числа, значения которых не превышают 255.
Заключение:
В этой статье на различных примерах были объяснены три различных способа генерации случайных чисел. Кодер может генерировать определенный диапазон случайных чисел с помощью переменной $RANDOM или команды shuf в bash. Кодировщик может использовать /dev/urandom с любой другой командой для генерации случайного числа байтов определенной длины или длины. Генерация случайных чисел – очень распространенное требование для программирования, и я надеюсь, что читатели смогут сгенерировать случайное число в соответствии со своими требованиями после прочтения этого руководства.
Если вы нашли ошибку, пожалуйста, выделите фрагмент текста и нажмите Ctrl+Enter.