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

问题描述:

也有类似的问题,但其中大多数都与语言相关。我在寻找一个通用的解决方案。给定一些方法来产生随机字节和数字n,我需要产生范围为1 ... n(含)的随机数。在随机字节的给定范围内生成随机数

我已经想出到目前为止:

  1. 为了确定表示Ñ所需的字节数,计算

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

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

    1. 扩展到1 ... N无偏差:

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

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

      在回答中,请假定没有可用的模块化位操作,但您可以假设任意精确的算术运算。 (我在Scheme中编程)

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

    开始=>
开始=“2>

这与您希望从0到1(含)的随机浮点数生成1到n的数字类似。如果r是随机浮动:

result = (r * n) + 1 

如果你有高精度计算,你可以通过在k字节表达的最高值除以你的k字节的整数计算r,+ 1

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

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