Random 概率为三分之一的随机数

Random 概率为三分之一的随机数,random,probability,Random,Probability,使用1位随机生成器(给出1或0),创建一个函数,该函数将以相同的概率返回0、1或2。正如注释中已经推导出的OP,解决方案是生成两个随机位并执行以下操作: 如果我们得到00,则返回0(25%的几率) 如果我们得到01,则返回1(25%几率) 如果我们得到10,则返回2(25%几率) 如果我们得到11,则再次生成两个随机位(25%几率) 现在,有两个问题值得思考 如果程序永远运行呢 这在理论上是可能的,但在实践中不会发生。我们需要生成序列11,11,11,11,。。。永远 由于获得11的几率只

使用1位随机生成器(给出1或0),创建一个函数,该函数将以相同的概率返回0、1或2。

正如注释中已经推导出的OP,解决方案是生成两个随机位并执行以下操作:

  • 如果我们得到
    00
    ,则返回
    0
    (25%的几率)
  • 如果我们得到
    01
    ,则返回
    1
    (25%几率)
  • 如果我们得到
    10
    ,则返回
    2
    (25%几率)
  • 如果我们得到
    11
    ,则再次生成两个随机位(25%几率)

现在,有两个问题值得思考

  • 如果程序永远运行呢
  • 这在理论上是可能的,但在实践中不会发生。我们需要生成序列
    11
    11
    11
    11
    ,。。。永远

    由于获得
    11
    的几率只有25%,因此连续获得两个
    11
    的几率为6.25%,因为
    0.25*0.25=0.0625
    。每个连续的
    11
    将另一个
    0.25
    的乘数添加到概率中。在得到真实答案之前生成十个
    11
    ,概率约为
    1e-6
    (百万分之一),而且这个函数非常快,即使它确实发生了,也不是问题

  • 重新生成两个位是否会影响我们想要的1/3概率
  • 答案是否定的。可以假设生成两组随机位是独立的过程。这意味着知道前两位的答案并不能告诉我们下两位的答案

    当我们决定再次开始生成过程时,就好像我们一开始从未做过一样,因为我们得到的最后一个结果与下一个结果无关


    (实际上,这是不正确的,因为随机数生成器在引擎盖下是确定性的,但一个好的均匀RNG在反复测试时将具有这种独立性)。

    ,我可以提出不同的解决方案,仅从一个范围中选择一个数字,实际上,它们足以给出概率几乎相等的数字。但这是一个理论问题,我无法找到一个严格的解决方案。问问自己:如果我生成一些随机位,我是否需要为每个可能的结果分配
    0
    1
    2
    ?还有什么我可以做的吗?一个可能的解决方案:我们可以很容易地用2位生成0..3;所以,我们这样做,如果我们有0..2的结果,我们使用它,如果我们有3,我们重复这个动作,直到我们得到0..2。这似乎有正确的概率,但如果单比特随机操作需要任何时间(在实践中总是如此),那么整个操作的时间在理论上是不受限制的。那么现在的问题是,这是否可能在有限的时间内实现?克里斯,我想我听不懂你的想法。。如果我们丢弃一些输出,它仍然会影响结果的概率。唯一能精确获得1/3的方法是拒绝采样。不过,只需使用大量位(比如32位)和mod,就可以获得足够的接近度。取决于应用程序是否需要精确。”平均而言,大约44%的几率需要至少重新运行该过程一次以生成随机数“不清楚”。。对于生成一个随机数,它应该是25%,对不起,这句话是无关的,可能会让人困惑,所以我删除了它。这就是至少重做一次实验的可能性。所以是重做一次的概率加上重做两次的概率加上重做三次的概率。。。所有这些概率加起来等于一个大于25%的数字。我可能在计算中出错了,但是。。。看起来接近33%。但这不是一个很重要的事实,所以如果你不明白的话,我会忽略它。