从随机字节生成给定范围内的随机数



也有类似的问题,但大多数问题都与语言有关。我要求的是通解。给定一种方法来产生k随机字节和一个数字n,我需要产生一个范围1的随机数…n (包容)。

到目前为止我想到了什么:

    要确定表示n所需的字节数,请计算

f(n):=ceiling(ln(n)/8ln(2))=ceiling(0.180337*ln(n))

  • 1…2^8f(n)范围内获取一个随机数,用于0索引字节b[i]:
  • r:=0 for i=0 to k-1: r = r + b[i] * 2^(8*i) end for

  • 缩放到1…N 无偏差:

    R(n,r) := ceiling(n * (r / 256^f(n)))

  • 但我不确定这不会产生偏见或一些微妙的一次性错误。你能检查一下这个声音和/或提出改进的建议吗?这是正确的做法吗?

    在答案中,请假设没有模态的篡改操作可用,但您可以假设任意精度的算术。(我正在用Scheme编程)

    编辑:我的方法肯定有问题,因为在我的测试中,掷骰子产生了一些0的情况!但是错误在哪里呢?

    如果您想从0到1(包括1)的随机浮点数生成从1到n的数字,这与您所做的类似。如果r是随机浮点数:

    result = (r * n) + 1
    

    如果你有任意精度的算法,你可以用k字节整数除以k字节可表达的最大值+ 1来计算r

    如果你有4个字节87 6F BD 4An = 200:

    ((0x876FBd4A/0x100000000) * 200) + 1
    

    相关内容

    • 没有找到相关文章

    最新更新