Bash 什么';使用$RANDOM+$巴什的地板?

Bash 什么';使用$RANDOM+$巴什的地板?,bash,random,Bash,Random,阅读此文: 在最后的评论中,我无法对这个问题给出一个像样的答案。这就是我在其他语言(C/C++,Pascal)中生成伪随机数的方式,并且没有任何问题——这仅仅与Bash有关吗 在编程语言中,您的随机数生成器可以为您提供刚好低于溢出点的值,后一种代码将有一个bug,其中介于MAXINT-FLOOR和MAXINT之间的项将溢出 Bash没有此错误,但是您正在阅读的引用显然是在没有这种意识的情况下编写的。$RANDOM返回一个随机的16位整数,即范围是0到32767。我认为评论中的问题假定您只想将下限

阅读此文:


在最后的评论中,我无法对这个问题给出一个像样的答案。这就是我在其他语言(C/C++,Pascal)中生成伪随机数的方式,并且没有任何问题——这仅仅与Bash有关吗

在编程语言中,您的随机数生成器可以为您提供刚好低于溢出点的值,后一种代码将有一个bug,其中介于
MAXINT-FLOOR
MAXINT
之间的项将溢出


Bash没有此错误,但是您正在阅读的引用显然是在没有这种意识的情况下编写的。

$RANDOM
返回一个随机的16位整数,即范围是
0
32767
。我认为评论中的问题假定您只想将下限更改为
$FLOOR
,但仍然希望上限为
32767
。如果使用
$RANDOM+$FLOOR
,则也会将上限增加到
32967
,这是不需要的

不过,您可以在不使用循环的情况下执行此操作:

number=$(($FLOOR + (($RANDOM*32567)/32767)))

我不确定ABS看到了什么问题。这是一个示例测试程序,我在其中选择10到19之间的数字。我用数组
向右
(ABS说的方式)和
向右
(他们说的方式不正确,但不解释原因)跟踪所选的数字:


我预计每个数字平均会被选择1000次左右,这两种方法都非常接近。

。(在数学中使用
[]
而不是
(())
;使用不带引号的变量等)。你的问题是什么?这是关于注释代码的吗?无论如何——如果RANDOM可以返回的最大值也是bash内置的整数数学可以处理的最大值,那么注释形式中会有一个严重的错误,因为进行加法可能会导致溢出。这个错误实际上并不存在,因为
$RANDOM
达到的最大值是32768,而bash的数学可以远远超过这个值——再次参见:ABS是一个可怕的、经常不准确的参考。可能是
+
应该是
%
,并且它暗示了引入的偏差吗?这不是一个错误,这是一个未记录的功能!
number=$(($FLOOR + (($RANDOM*32567)/32767)))
#! /bin/bash

declare -a right_way
declare -a wrong_way

for count in {1..10000}
do
    #
    # Generating Random Number between 10 and 20
    #
    number=0
    while (( $number < 10 ))
    do
        (( number = $RANDOM % 20 ))
    done
    right_way[$number]=$(( ${right_way[$number]} + 1 ))
    number=$(($RANDOM % 10 + 10 ))
    wrong_way[$number]=$((${wrong_way[$number]} + 1 ))
done

printf "%10s   %10s   %10s\n" "Number" "Right Way" "Wrong Way"
for index in {10..19}
do
    printf "%10d   %10d   %10d\n" $index ${right_way[$index]} ${wrong_way[$index]}
done
    Number    Right Way    Wrong Way
        10         1027         1006
        11         1001          998
        12          996          974
        13          985         1003
        14         1065          991
        15          990          990
        16          959         1063
        17         1023          989
        18          967          988
        19          987          998