将[0,1]区间扩展为[a,b]的正确方法是什么?

时间:2010-06-14 09:37:07

标签: language-agnostic random

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

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

5 个答案:

答案 0 :(得分:5)

将区间[0,1]除以B-A + 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"]  

alt text

答案 1 :(得分:1)

查看它的另一种方法,其中r是0到1范围内的随机数:

(1-r)a + rb

至于你对结果的额外要求是一个整数,也许(除了使用内置的铸造)模数运算符可以帮助你。看看这个问题和答案:

Expand a random range from 1–5 to 1–7

答案 2 :(得分:1)

那么,为什么不看看Python本身是如何做到的呢?阅读安装的random.py目录中的lib

在将其删除后只支持random.randint()(这是你想要的)的行为并删除所有非整数或越界参数的错误检查后,你得到:

import random
def randint(start, stop):
    width = stop+1 - start
    return start + int(random.random()*width)

测试:

>>> l = []
>>> for i in range(2000000):
...     l.append(randint(3,6))
...
>>> l.count(3)
499593
>>> l.count(4)
499359
>>> l.count(5)
501432
>>> l.count(6)
499616
>>>

答案 3 :(得分:0)

X = (Rand() * (B - A)) + A

答案 4 :(得分:0)

假设r_a_bab之间所需的随机数,而r_0_101之间的随机数。应该工作得很好:

r_a_b = (r_0_1 * (b-a)) + a