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