Как сгенерировать случайное число в диапазоне, который может быть положительным или отрицательным, с помощью /dev/random или /dev/urandom с помощью bash?

Этот вопрос связан с 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" | bc

или даже лучше

echo "$(od -An -N4 -tu4 /dev/random) % 15 + 1" | bc  
-3
задан 24 February 2021 в 09:33

1 ответ

Самый простой и чистый способ, который я могу придумать, это то, что у вас уже есть в вашем вопросе:

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.

1
ответ дан 18 March 2021 в 23:31

Другие вопросы по тегам:

Похожие вопросы: