【问题标题】:How to generate a random number from a random bit generator and guarantee termination?如何从随机位生成器生成随机数并保证终止?
【发布时间】:2012-11-30 18:19:54
【问题描述】:

假设我有一个返回随机位的函数,是否可以写一个函数在一定范围内统一生成一个随机数并始终终止?

我知道如何执行此操作,以便它应该(并且可能会)终止。我只是想知道是否有可能编写一个保证终止(并且它不必特别有效。它会有什么复杂性?

这是不总是终止版本的代码

int random(int n)
{
  while(true)
  {
    int r = 0;
    for (int i = 0; i < ceil(log(n)); i++)
    {
      r = r<<1;
      r = r|getRandomBit();
    }

    if(r<n)
    {
      return r;
    }
  }
}

【问题讨论】:

    标签: random complexity-theory theory


    【解决方案1】:

    我认为这会奏效:

    假设你想生成一个[a,b]范围内的数字

    使用二进制基数在[0,1} 范围内生成一个分数r。这意味着使用您的随机函数生成多个表单0.x1x2x3....,其中每个x 是0 或1。

    一旦你有了它,你可以通过计算ceil(r*(b-a))轻松生成[0,b-a]范围内的数字,然后只需添加a即可获得[a,b]范围内的数字

    【讨论】:

    • 这是一个很好的近似值,但它实际上并不会以相等的概率产生范围内的整数,对吧?浮点数的间距不均匀。
    【解决方案2】:

    如果范围的大小不是 2 的幂,则除非通过相当于拒绝抽样的方式,否则您无法获得完全均匀的分布。但是,您可以通过从大范围采样一次,然后将较小的范围划分为该范围来尽可能接近均匀。

    例如,虽然您无法在 1 到 10 之间进行均匀采样,但您可以通过选择 10 个随机位轻松地在 1 到 1024 之间进行采样,并找出某种方法将其公平地分成 10 个大小大致相同的区间.

    选择额外的位具有将您在选择中必须看到的最大误差(来自真正的均匀性)减半的效果......因此,当您选择更多位时,误差会呈指数下降。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-01-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-06-14
      • 2023-01-03
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多