许多随机数生成器返回 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/