许多随机数生成器返回 0 到 1 之间的浮点数。

在 a 和 b 之间获得 整数 的最佳和正确方法是什么?

最佳答案

在 B-A+1 个 bin 中划分区间 [0,1]

示例 A=2, B=5

        [----+----+----+----]
        0    1/4  1/2  3/4  1
Maps to    2    3    4    5

公式的问题
 Int (Rnd() * (B-A+1)) + A

是您的 Rnd() 生成间隔在两侧都是封闭的,因此 0 和 1 都是可能的输出,并且当 Rnd() 恰好为 1 时,公式给出 6。

在真正的随机分布(非伪)中,1 的概率为零。我认为编写如下程序是足够安全的:
 r=Rnd()
 if r equal 1
     MyInt = B
 else
     MyInt = Int(r * (B-A+1)) + A
 endif

编辑

只是在 Mathematica 中进行快速测试:

定义我们的函数:
f[a_, b_] :=  If[(r = RandomReal[]) == 1, b, IntegerPart[r (b - a + 1)] + a]

在 [1,100] 中构建一个包含 3 个 10^5 数字的表:
table = SortBy[Tally[Table[f[1, 100], {300000}]], First]

检查最小值和最大值:
In[137]:= {Max[First /@ table], Min[First /@ table]}

Out[137]= {100, 1}

让我们看看分布:
BarChart[Last /@ SortBy[Tally[Table[f[1, 100], {300000}]], First],
        ChartStyle -> "DarkRainbow"]

关于language-agnostic - 将 [0,1] 区间扩展为 [a,b] 的正确方法是什么?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/3036208/

10-10 11:42