从随机位生成随机数

Igg*_*boo 5 random algorithm

所以我有一个函数可以给我随机位 rand(0,1) 我想将其推广到 rand(a,b) ,它给我一个范围为 a 到 b 的随机数。

我的想法是只计算 b - a 中的位数,然后将它们附加在一起。我认为这会起作用,但不会是统一的。我觉得它会偏向较大的数字而不是较小的数字(接近 a 的数字)。并不是真的要求一个直接的答案,只是一些帮助就很好了。

编辑:这是我到目前为止的想法,只是不确定制服部分

    pseudo code:
    function rand_range(a, b):
        n = b - a
        sum = a
        for i in range(n):
            sum += rand(0,1)

        return sum
Run Code Online (Sandbox Code Playgroud)

Duk*_*ing 2

是的,它不会是统一的。

考虑 3 位的简单情况:

0+0+0  0
0+0+1  1
0+1+0  1
0+1+1  2
1+0+0  1
1+0+1  2
1+1+0  2
1+1+1  3
Run Code Online (Sandbox Code Playgroud)

很明显,1 和 2 比 0 或 3 出现的可能性更大。

当您增加位数时,这会变得更加不均匀 - 0 并且最大值永远不会出现多次,中间的出现次数最多。


对于随机分布,我能想到的最好方法是丢弃一些生成的数字。

向上舍b-a入到最接近的 2 减 1 次方,然后单独生成每个位,如果结果大于b-a,则重试。

因此,如果b-a是 5,则向上舍入为 7,并生成所涉及的 3 位以使最大数为 7:

000  0
001  1
010  2
011  3
100  4
101  5
110  6
111  7
Run Code Online (Sandbox Code Playgroud)

现在,如果有 6 或 7 个,请将它们扔掉并重试。

这可以通过使用字符串并连接 0 或 1,并在末尾转换为数字来完成,或者在每一步乘以 2(将所有位向左移动一位)并添加 0 或1.

最后您仍将结果添加到a.