Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/oracle/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Algorithm 从随机字节生成给定范围内的随机数_Algorithm_Random_Cryptography_Numeric Ranges - Fatal编程技术网

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

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)

也有类似的问题,但大多数问题都过于语言特定。我在寻找一个通用的解决方案。给定一些生成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):=天花板(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