algorithm - 从随机位生成随机数

标签 algorithm random

所以我有一个给我随机位 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

最佳答案

是的,它不会是统一的。

考虑 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

很明显,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

现在,如果是 6 或 7,就把它们扔掉再试。

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

最后,您仍会将结果添加到a

关于algorithm - 从随机位生成随机数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22137985/

相关文章:

mysql - 如何从大表的子集中选择mysql中的n个随机行?

C:尝试制作一个 m*n 随机正态分布数字矩阵(极坐标形式的 Box muller 2)

c++ - cuda随机数并不总是返回0和1

java - 合并然后排序,还是排序然后合并更快?

algorithm - 求一个数的商

javascript - 使用 while 循环连接排序数组的时间和空间复杂度是多少?

java - 随机但很可能是 1 个 float

java - 强制关闭!!用于分配 RGB 值 0-255 中的随机颜色的按钮

java - Java 中的有向图处理

arrays - 如何从项目数组创建有向图?