如何使用 bash 的 dev/urandom 生成一个在正数或负数范围内的随机数?

如何使用 bash 的 dev/urandom 生成一个在正数或负数范围内的随机数?

该问题与 bash、Ubuntu 等 Linux、/dev/random 和 /dev/urandom 有关。

如何通过 bash 上的 /dev/urandom 生成一个可以为正数或负数的范围内的随机数?

已知的有:

以下是未搜索解决方案的示例,该示例在 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

相关内容