所以我有一个函数可以给我随机位 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)
是的,它不会是统一的。
考虑 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
.