Algorithm 从随机字节生成给定范围内的随机数
也有类似的问题,但大多数问题都过于语言特定。我在寻找一个通用的解决方案。给定一些生成k个随机字节和一个数字n的方法,我需要生成一个范围为1…n(包括)的随机数 到目前为止,我想到的是:Algorithm 从随机字节生成给定范围内的随机数,algorithm,random,cryptography,numeric-ranges,Algorithm,Random,Cryptography,Numeric Ranges,也有类似的问题,但大多数问题都过于语言特定。我在寻找一个通用的解决方案。给定一些生成k个随机字节和一个数字n的方法,我需要生成一个范围为1…n(包括)的随机数 到目前为止,我想到的是: 要确定表示n所需的字节数,请计算 f(n):=上限(ln(n)/8ln(2))=上限(0.180337*ln(n)) 获取范围为1…2^8f(n)的0索引字节b[i]的随机数: r:=0 对于i=0到k-1: r=r+b[i]*2^(8*i) 结束于 要在无偏差的情况下缩放到1…n,请执行以下操作: R(n,R)
f(n):=上限(ln(n)/8ln(2))=上限(0.180337*ln(n))
r:=0
对于i=0到k-1:
r=r+b[i]*2^(8*i)
结束于
R(n,R):=天花板(n*(R/256^f(n))
编辑:我的方法肯定有问题,因为在我的测试中,掷骰子会产生一些0!但是错误在哪里?这类似于如果要从0到1(包括0到1)的随机浮点数生成1到n的数字时所做的操作。如果
r
是随机浮点:
result = (r * n) + 1
如果您有任意精度的算术运算,您可以通过将k字节整数除以k
字节中可表达的最大值+1来计算r
因此,如果您有4个字节876fbd4a
,并且n
=200:
((0x876FBd4A/0x100000000) * 200) + 1