Этот вопрос связан с bash, Linux типа Ubuntu, /dev/random и /dev/urandom .
Как генерировать случайное число в диапазоне, который может быть положительным или отрицательным, с помощью /dev/random или /dev/urandom on bash ?
Известно:
Слежение - это образец неискаженного решения, чтобы сделать это в диапазоне на основе bash, неискаженной функцией "RANDOM" и только в положительном диапазоне.
min=1
max=1000
rnd_count=$((RANDOM%(max-min+1)+min))
echo $rnd_count
Слежение - это образец решения, которое можно выполнить с помощью /dev/urandom на неискаемом языке C:
> ##################################################
> # Random number generator, crypto quality
> #################################################
> # Returns a random floating point number between $min and $max, inclusive
> # With the default arguments, this is almost the same as expr rand()
> # Doesn't work on Windows, only on Unix-based OS such as MacOSX and Linux proc getRandomNumber {{min 0} {max 1}} { global tcl_platform
> if {$tcl_platform(platform) == "unix"} {
> set f [open /dev/urandom rb] ; set eightRandomBytes [read $f 8] ; close $f
> binary scan $eightRandomBytes h16 eightRandomBytesHex
> # n is an integer from 0 to 18446744073709551615 inclusive... lossless conversion
> set n [scan $eightRandomBytesHex %llx]
> # map n to min-max inclusive... maybe we lose a little randomness here (precision)
> set randomNumber [expr (($n/18446744073709551615.0) * ($max - $min)) + $min]
> return $randomNumber } else {
> error "getRandomNumber: Only works with Unix-based platforms" } }
Источник: https://wiki.tcl-lang.org/page/Cryptographically+secure+secure+random+numbers+using+%2Fdev%2Furandom
Follow - образец частичного решения не поискового питонового решения с помощью питоновой функции:
python -c "import random; print random.randint(1,1000)"
A опять же, Как сгенерировать случайное число в диапазоне, которое может быть положительным или отрицательным, /dev/random или /dev/urandom на bash (не на других языках )?
Частичное решение заключается в генерации случайного числа по bash-случайности или urandom на положительном диапазоне работает следующим образом, как это сделать на положительном и отрицательном диапазоне тоже неизвестно мне. И это не чистый баш. Разыскивается чистый баш-решение.
echo "$(od -An -N4 -tu4 /dev/urandom) % 15 + 1" | b
c
или даже лучше
echo "$(od -An -N4 -tu4 /dev/random) % 15 + 1" | bc
Самый простой и чистый способ, который я могу придумать, это то, что у вас уже есть в вашем вопросе:
min=-100; max=1; rnd_count=$((RANDOM%($max-$min+1)+$min)); echo $rnd_count
Вы можете легко преобразовать это в функцию:
getRand(){
min="${1:-1}" ## min is the first parameter, or 1 if no parameter is given
max="${2:-100}" ## max is the second parameter, or 100 if no parameter is given
rnd_count=$((RANDOM%($max-$min+1)+$min)); ## get a random value using /dev/urandom
echo "$rnd_count"
}
Если вы либо вставите эти строки в свой терминал, либо добавите их в свой ~/. bashrc
и открыть новый терминал, вы можете сделать:
$ getRand -5 5
-3
Это дает случайное число между -5
и 5
.