在随机字节的给定范围内生成随机数
问题描述:
也有类似的问题,但其中大多数都与语言相关。我在寻找一个通用的解决方案。给定一些方法来产生随机字节和数字n,我需要产生范围为1 ... n(含)的随机数。在随机字节的给定范围内生成随机数
我已经想出到目前为止:
- 为了确定表示Ñ所需的字节数,计算
f(n):=ceiling(ln(n)/8ln(2))=ceiling(0.180337*ln(n))
- 获取范围为的一个随机数1 ... 2^8f(n)对于0索引字节b [i]:
-
扩展到1 ... N无偏差:
R(n,r) := ceiling(n * (r/256^f(n)))
r:=0 for i=0 to k-1: r = r + b[i] * 2^(8*i) end for
但我不确定这不会造成偏见或一些微妙的一次性错误。你能检查这个声音和/或提出改进建议吗?这是正确的方法吗?
在回答中,请假定没有可用的模块化位操作,但您可以假设任意精确的算术运算。 (我在Scheme中编程)
编辑:我的方法肯定有问题,因为在我的测试中,掷骰子产生了一些0的情况!但错误在哪里?
答
这与您希望从0到1(含)的随机浮点数生成1到n的数字类似。如果r
是随机浮动:
result = (r * n) + 1
如果你有高精度计算,你可以通过在k
字节表达的最高值除以你的k字节的整数计算r
,+ 1
所以,如果你有4个字节87 6F BD 4A
和n
= 200:
((0x876FBd4A/0x100000000) * 200) + 1