Linux get random number

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

Источник

Сгенерировать случайное число в 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.

Источник

Bash Shell Generate Random Numbers

H ow do I create or generate random numbers (sequence of numbers that lack any pattern), under Bash shell?

The bash shell offers $RANDOM variable (it also works with ksh). From the bash man page:

Each time this is referenced, a random integer between 0 and 32767 is generated. The sequence of random numbers may be initialized by assigning a value to RANDOM. If RANDOM is unset, it loses its special properties, even if it is subsequently reset.

To view $RANDOM, enter:
$ echo $RANDOM
Sample outputs:

You can use the bash loop as follows to test random numbers:

  • No ads and tracking
  • In-depth guides for developers and sysadmins at Opensourceflare✨
  • Join my Patreon to support independent content creators and start reading latest guides:
    • How to set up Redis sentinel cluster on Ubuntu or Debian Linux
    • How To Set Up SSH Keys With YubiKey as two-factor authentication (U2F/FIDO2)
    • How to set up Mariadb Galera cluster on Ubuntu or Debian Linux
    • A podman tutorial for beginners – part I (run Linux containers without Docker and in daemonless mode)
    • How to protect Linux against rogue USB devices using USBGuard

Join Patreon

You can store it to a variable as follows:

You can have a random integer number within a certain range as follows:

Here is a sample shell script to find out random TCP port:

Another shell script to setup a random wallpaper. You can call this one from your crontab:

Using /dev/urandom or /dev/random

The character special files /dev/random and /dev/urandom provide an interface to the kernel’s random number generator. You can use /dev/urandom as follows:
$ od -vAn -N4 -tu4
Sample outputs:

You can use /dev/random as follows:
$ od -An -N2 -i /dev/random
Sample outputs:

See the following man pages:
man 4 random
man bash
man od

🐧 Get the latest tutorials on Linux, Open Source & DevOps via

Category List of Unix and Linux commands
Documentation help • mandb • man • pinfo
Disk space analyzers df • duf • ncdu • pydf
File Management cat • cp • less • mkdir • more • tree
Firewall Alpine Awall • CentOS 8 • OpenSUSE • RHEL 8 • Ubuntu 16.04 • Ubuntu 18.04 • Ubuntu 20.04
Linux Desktop Apps Skype • Spotify • VLC 3
Modern utilities bat • exa
Network Utilities NetHogs • dig • host • ip • nmap
OpenVPN CentOS 7 • CentOS 8 • Debian 10 • Debian 8/9 • Ubuntu 18.04 • Ubuntu 20.04
Package Manager apk • apt
Processes Management bg • chroot • cron • disown • fg • glances • gtop • jobs • killall • kill • pidof • pstree • pwdx • time • vtop
Searching ag • grep • whereis • which
Shell builtins compgen • echo • printf
Text processing cut • rev
User Information groups • id • lastcomm • last • lid/libuser-lid • logname • members • users • whoami • who • w
WireGuard VPN Alpine • CentOS 8 • Debian 10 • Firewall • Ubuntu 20.04

Comments on this entry are closed.

Thanks for the tips. Two mistake though:
– ‘echo $(( r %= 200 ))’ should be ‘echo $(( n %= 200 ))’
– ‘echo $((RANDOM%200+100))’ return a number between 100 and 300, not 100 and 200 as commented above.

The example involving 200 is not a uniform distribution. The mapping function used is f(x) = x module 200. This input, x, is a uniform distribution. The output f(x) is not because the the size of the domain is a power of 2 and the size of the range is 200. if f(x) were random, the size of the domain would be a multiple of the size of the range. A power of 2 is never a multiple of 200. The following would be random: while (set I to $RANDOM)

Nice topic.
Precision:

echo $(( n %= 200 ))

Will return an integer strictly less than 200.

I think that If you want to include 200, you could use:

echo $(( n %= 200 + 1))

But then, [n] will never be zero, it will belong to [1;200]

Then if you want a random integer belonging to [0;200],
you may use:

echo $(( n %= 201))

Like the man page excerpt above says, you can initialize the sequence by assigning an arbitrary number to RANDOM before using it. If you don’t want the same ‘random’ sequence each time you run the script, you should seed RANDOM by assigning an arbitrary number before using it. The process ID works well:

OpenSSL can also be used as a source of random numbers, and is a good idea if the numbers are going to be used for cryptographic key generation or nonces. The generator used by OpenSSL uses a FIPS 140 approved algorithm and has been widely tested and reviewed.

OpenSSL on Unix systems will leverage available entropy from the OS RNG as part of it’s seed/start process.

Here are some sample commands – quoted from the “OpenSSL Command-line HOWTO”:

# write 128 random bytes of base64-encoded data to stdout
openssl rand -base64 128

# write 1024 bytes of binary random data to a file
openssl rand -out random-data.bin 1024

Cheers, Erik
ArtofInfoSec.com

Is there any way to do this with a custom random seed?

vivek,
There is a bug here:

# display random number between 100 and 200.
echo $((RANDOM%200+100))

This will display random number between 100 and 300 (not 200)

If you want to display random number between 100 and 200, use:

echo $((RANDOM%100+100))

Would you modify yor code above?

actually it’s between 100 and 299.

#Bug in ‘display random number between 100 and 200.’
echo $((RANDOM%200+100))

#For determine the random number between x and y is:
echo $((x + RANDOM%(y-x+1)))

Works good:
echo $(( RANDOM% ($maximal – $minimal) + $minimal ))

example: maximal=10 minimal=5 try it 😉

Or if you want numbers between 5 – 10, you can do this:
echo $(( RANDOM% 5 + 5 ))
5 – minimum, maximum is +5 bigger

You may be overwhelmed or overloaded,
but you will also find that this page does not meet your quality standard.

1) As Dago said:
#To get random integer number between x and y, x and y beeing included as in [x;y] notation, use:
echo $((x + RANDOM%(y-x+1)))

2) Typo
There is still a typo here: echo $(( r %= 200 ))
Should be: echo $(( n %= 200 ))

3) Misunderstanding
Why do you use “%=” where “%” will be appropriate ?
That is: echo $(( n %= 200 ))
Should be: echo $(( n % 200 ))

KUTGW, I really appreciate your site – as usual, great work.

Hi
that was useful, didn’t know there was more than one method to generate random number.

Nice and instructive post!
I was looking for a way to seed the $RANDOM-ness in bash, and I found this can be done by setting the $RANDOM variable:
$ RANDOM=1
$ echo $RANDOM
16807
$ echo $RANDOM
15089
$ RANDOM=1
$ echo $RANDOM
16807
$ echo $RANDOM
15089

May be a good way for seeding randomness would be using time:
$ RANDOM=$(date +%s)

in a simplest exposure:
$((RANDOM%offsetFromLowest+Lowest))

Nanosecond semi-random number generator

Can also be used as $RANDOM shuffler:

$ RANDOM=$(date +’%N’)
$ echo $RANDOM
13967
$ RANDOM=$(date +’%N’)
$ echo $RANDOM
27211

Random entropy pool init with subsequent selection of some text to echo. ‘+’ should never hit (%3 + 1 == 1 to 3). Output will be 1,2 or 3.

RANDOM=`date +%s%N | cut -b14-19`;
case $[$RANDOM % 3 + 1] in 1) echo ‘1’;; 2) echo ‘2’;; 3) echo ‘3’;; *) echo ‘+’;; esac

I find ‘shuf’ to be a good solution. You can specify the range and how many numbers you want back, as well as a random source to make it repeatable when testing.

RANDOM=$(shuf -i 1-1000 -n 1)

although it’s probably as good as using ‘od’.

Using $RANDOM works, but technically won’t give you a very even distribution (as it’s between 0 and 32767 before you % 100 it or whatever).

Источник

Читайте также:  Android studio mac os горячие клавиши
Оцените статью