该问题与 bash、Ubuntu 等 Linux、/dev/random 和 /dev/urandom 有关。
如何通过 bash 上的 /dev/urandom 生成一个可以为正数或负数的范围内的随机数?
已知的有:
- /dev/urandom 比 random 生成更多的随机数。
- /dev/random 和 /dev/urandom 的不同之处在于:https://www.2uo.de/myths-about-urandom/
- https://heitorpb.github.io/bla/2020/04/07/bash-random-numbers/
以下是未搜索解决方案的示例,该示例在 bash 的某个范围内执行,通过未搜索函数“RANDOM”并且仅在正范围内执行。
min=1
max=1000
rnd_count=$(( RANDOM % ( max - min + 1 ) + min ))
echo $rnd_count
部分解决方案是通过 bash random 或 urandom 在正范围内生成随机数,具体方法如下,至于如何在正范围和负范围内执行此操作,我不清楚。而且它不是纯 bash。需要纯 bash 解决方案。
echo "$(od -An -N4 -tu4 /dev/urandom) % 15 + 1" | bc
答案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
。
答案2
您可以按照下列方式进行:
#!/bin/bash
get_rnd_num_eq_dis(){ # max Zahlenbereich 0 - 32767
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
srnd="$((0x$(dd if=/dev/urandom of=/dev/stdout bs=4 count=1 status=none | xxd -p)))" # SRANDOM Nachbau
rnd_count=$(( srnd % ( max - min + 1 ) + min ));
echo "$rnd_count"
}
ug=-1000 # untere Grenze
og=1000 # obere Grenze
var="$(get_rnd_num_eq_dis $ug $og)" # Call the function
echo "$var" # output
sleep 2