Algorithm 使用自定义参数实现随机0 1

Algorithm 使用自定义参数实现随机0 1,algorithm,probability,Algorithm,Probability,我试图解决以下问题: 我有一个函数,它生成0或1,概率等于0.5,我想用前面的函数和基本的数学运算实现另一个函数,它做同样的事情,但概率p给定(0一个简单的解决方案,在许多情况下应该是可行的,描述如下: 将p解释为有理数a/b的最低值。如果p只是一个介于0和1之间的浮点数,那么b只是一个10的幂,小数点后的零位数与小数点后的位数相同,而a是通过取小数点后的数字字符串并消除前导零而形成的数 生成一个长度为上限(log(b-1))的随机位字符串,其中对数的底为2,上限将任何非整数舍入到下一个整数。通

我试图解决以下问题:


我有一个函数,它生成0或1,概率等于0.5,我想用前面的函数和基本的数学运算实现另一个函数,它做同样的事情,但概率p给定(0一个简单的解决方案,在许多情况下应该是可行的,描述如下:

  • 将p解释为有理数a/b的最低值。如果p只是一个介于0和1之间的浮点数,那么b只是一个10的幂,小数点后的零位数与小数点后的位数相同,而a是通过取小数点后的数字字符串并消除前导零而形成的数
  • 生成一个长度为上限(log(b-1))的随机位字符串,其中对数的底为2,上限将任何非整数舍入到下一个整数。通过调用提供的函数并记录答案来完成此操作
  • 如果随机位字符串(不包括前导零)表示0和b-1(包括)之间的整数,则继续;否则,如果该数字大于b,则返回步骤2,生成随机位字符串,直到得到一个有效的位字符串
  • 如果随机位字符串(不包括前导零)表示介于0和-1(包括-1)之间的整数,则返回0;否则返回1

  • 这应该在有限的预期时间内返回,但在无限的最坏情况下返回,确切地说,如果p是有理数,则概率为p=a/b的数字0和概率为p=(b-a)/b的数字1(请注意,双精度都是有理数,如步骤1所述)这实际上与Patrick87提出的算法大致相同,但它一次生成一个位,当找到答案时立即停止。它本质上与

    我在这里用Python实现了

    创建一个以相同概率返回0或1的函数。 >>>从随机导入随机 >>>f=lambda:int(随机()>#检查 >>>范围(1000000)内i的总和(f()) 500251 >>>#用它来创建一个有偏差的函数。你可以用这个 >>>#以分子、分母表示的有理数 >>>#或p值介于0和1之间。Python不关心 >>>#数字是整数,但其他语言可能是。 >>>def偏置(数值,denom=1): …尽管如此: …数值+=数值 …如果numer>=denom: …数值-=denom …如果f():返回1 ……其他: …如果f():返回0 ... >>>总和(范围(1900000)内i的偏差(0,19)) 0 >>>总和(范围(1900000)内i的偏差(1,19)) 100096 >>>总和(范围(1900000)内i的偏差(5,19)) 500255 >>>总和(范围(1900000)内i的偏差(18,19)) 1799988 >>>总和(范围(1900000)内i的偏差(19,19)) 1900000 实际上,循环通过将分子的当前值加倍并与分母进行比较,一次构造一位分子/分母的二进制表示。然后将其与延迟生成的随机二进制分数进行比较,直到可以确定随机分数是大还是小


    尽管对基函数
    f
    的调用次数在理论上是无界的,但是无论要偏置的参数是什么,
    biasted
    调用
    f
    的预期次数都是2。(这是因为随机比特流匹配
    k
    二进制数字的概率是2-k,与二进制数字的实际值无关。)

    允许什么基本的数学运算?在C语言中不调用库就可以做什么?或者只需+、-、*和/?@Patrick87“基本数学运算",我猜使用将是非法的,但我们能在变量中保存值吗,如果/然后/否则,循环等等?我会说是的,几乎每个算法都包括最后一个问题-p是有理数还是仅仅是任何实数?在后一种情况下,你是在寻找一个算法,给出精确的实数概率,还是一个近似的有理数够了吗?