【问题标题】:Using random number generator to generate a number with a given expected value使用随机数生成器生成具有给定期望值的数字
【发布时间】:2013-06-20 20:47:58
【问题描述】:

我遇到了以下问题:

使用 rand() 函数,生成一个期望值为 k 的数字。选项是:

1)

   int GetRandom(int k)
   {
       v=0;
       while(rand()<1.0f/(float)k)
           v++; 
       return v;
    }

2)

   int GetRandom(int k)
   {
       v=0;
       while(rand()<(1-1.0f/(float)k))
           v++; 
       return v;
    }

3)

   int GetRandom(int k)
   {
       v=0;
       while(rand() > (1-1.0f/(float)(k+1)))
           v++; 
       return v;
    }

1) 似乎是正确的答案。检查k 的特定值的结果似乎表明情况并非如此。 (我设置了k=3100000试验值的频率分布见下图)

如何做到这一点?

问题有点类似于this一。

【问题讨论】:

    标签: random probability


    【解决方案1】:

    你想要(2)。这对Geometric Distribution (link) 进行采样,平均值为k

    几何分布代表这种实验:

    • 某个事件反复发生,结果为 0 或 1
    • 事件的结果为 1,概率为 p,0 概率为 1-p
    • 第一个结果为 1 的事件的索引是多少?

    所以如果X ~ G(p),其中X 是一个随机变量,p 是上面的概率,那么X 表示“第一个结果为 1 的事件的索引是多少?”期望是E[X] = 1/p

    鉴于此信息,现在应该清楚以下表示随机变量 Xp = 1/k 的采样(等效于 (2))。

    int Sample(int k)
    {
        int v = 1;
        while (true)
        {
            //outcome is true with probability p = 1/k
            bool outcome = rand() < 1 / (double)k;
            if (outcome)
                return v;
            else
                v++;
        }
    }
    

    请注意,查看峰值(众数)和预期分布不是一回事。几何分布的峰值总是在 1!

    【讨论】:

    • @curryage 期望(平均)和模式(峰值)不会相同。当您使用k=3 时,对一大堆值进行采样,然后对这些值进行平均。它将接近 3。 - 几何分布的众数(峰值)始终为 0,无论您选择什么 p
    • @curryage 这是错误的修复方法。您应该从int v = 1(而不是int v = 0)开始。答案中的推理没有任何问题 - 这只是您想要 0 索引还是 1 索引的问题。
    • @curryage Sample() 函数不会产生预期值。它产生的是来自分布(几何)的一系列值,Timothy Shields 将其调整为具有所需的期望值。期望值是基础分布的数学属性,而不是样本的特征——一旦你指定了分布,它的期望就可以在没有任何抽样的情况下计算出来。但是,可以通过取Sample() 生成的值的平均值来估计。随着样本量的增加,该平均值应向预期值收敛。
    • @curryage 你无法证明它,但你可以确认它满足几何分布的假设:1)每次试验的结果是“成功”或“失败”,常数每次试验的概率; 2)试验相互独立; 3)你继续前进,直到你获得成功。然后,几何分布描述了第一次成功发生在第 n 次试验的概率,对于从 1 到无穷大的所有 n 值。现在看看Sample()。固定成功概率:检查!独立试验:检查!继续前进,直到成功发生:检查!它是几何的。
    • @curryage rand0to1() 产生介于 0 和 1 之间的值。对于任何区间 [a,b]0 &lt;= a &lt; b &lt;= 1,在该范围内的 rand0to1() 结果的长期比例是 b-a ,范围的长度。如果您测试rand0to1() &lt;= p,您正在检查[0,p] 范围内的结果,其长度为p-0=p,因此出现比例为p。检查rand0to1() &gt;= 1-p 或长度为 p 的介于 0 和 1 之间的任何其他范围同样有效。 rand0to1() &lt;= p 很简单。使用
    猜你喜欢
    • 1970-01-01
    • 2011-05-15
    • 2011-09-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多