如何用C ++表示这种概率?

时间:2011-11-29 20:45:52

标签: c++

我找到了一些概率,其总和不给1,注意这些概率不必给1

所以我有类似的东西

0.00112
0.12311
0.3933393
0.111010
0.0002
0.003
0.00000000004

现在我正在尝试在我的应用程序中使用这些概率。

我做的是找到他们的标准化形式,所以我找到了总和,然后我得到了这些概率

0.00177277097
0.194862351
0.622589724
0.175710094
0.000316566244
0.00474849366
6.33132488 × 10^(-11)

他们的总和得出1

现在我正在考虑使用1,000,000个地方的数组,我将举例说明第一个概率为0.00177277097 * 1,000,000个地方,它们具有概率值,并为其他地方做同样的事情

问题是,如果我使用这种方法,我可能会失去一些分数,例如,最后我可能会填充999,994个位置,而不是1,000,000 ..

在这种情况下是否还有其他可用的方法?

3 个答案:

答案 0 :(得分:1)

假设1,000,000个元素数组的目的是随机选择非线性分布中的七个元素之一(至少)六个十进制数字的准确度,那么就有更简单的方法。

你表明你可以将概率归一化为1(好!),所以第一步是将它们归一化为整数,总计为1,073,741,824(2 ^ 30):

0.00112       ->   1903498.331       ->   1903498
0.12311       -> 209231856.7         -> 209231857
0.3933393     -> 668500626.0         -> 668500626
0.111010      -> 188667276.5         -> 188667276  (I rounded this down)
0.0002        ->    339910.4162      ->    339910
0.003         ->   5098656.244       ->   5098656
0.00000000004 ->         0.067982083 ->         1  (I rounded this up)

并将他们的总和放入一个数组中:

static const int dist[7] = {1903498, 
                            211135355, 
                            879635981, 
                            1068303257, 
                            1068643167, 
                            1073741823, 
                            1073741824}; //last should be 1073741824

然后选择随机分配:

element getrandom(element data[7]) {
    int r = ((rand() * RAND_MAX) ^ rand()) & 0x3FFFFFFF; //(2^30)-1
    for(int i=0; i<6; ++i) {
        if (r < dist[i]) return data[i];
    }
    return data[6];
}

初始化,更小,可能更快,这将更快。 请注意,即使有六位精度,最后一个也不会出现。我捏造它的可能性达到了最低限度。

答案 1 :(得分:0)

在不知道1,000,000元素数组的目的的情况下,无法确定您需要的结果。

听起来有一个与每个概率相关联的值,并且您希望创建一个仅包含这些值的数组,其分布由它们的概率决定。

如果你想每次都对每个值的完全相同的计数,那么它可能最终会减少到某种最小化和的NP-硬整数问题({ p 概率中每个 p 的* 1000000}。

但是,如果你可以处理一些随机性 - 那么你只需要从你的发行版中创建一个随机抽样。首先计算累积分布函数,它只是概率的“运行总和”。在这种情况下,它将是:

0.00177277097
0.00177277097 + 0.194862351
0.00177277097 + 0.194862351 + 0.622589724
...
1

然后对于数组中的每个插槽,获取一个介于0和1之间的随机数。只需找到它在分布中的两个累积值并插入相应的值。

答案 2 :(得分:-1)

嗯,我不太明白你想做什么,但我可以帮助你使用数组部分。 而不是在std :: vector上读取数组。它可以像:

一样使用
#include <vector>
#include <iostream>
int main()
{
  std::vector<double> vec;
  vec.push_back(0.00112);
  vec.push_back(0.12311);
  ...


  //To access the vector you can use vec[index-you-want]
  std::cout << vec[0]; //prints the first element "0.00112"
}

当您向其添加元素时,它会增长。刚看一下std :: vector。太棒了。

祝你好运!