C ++多项式分布

时间:2018-11-24 16:09:56

标签: c++ algorithm recursion probability multinomial

我正在尝试编写一种多项式算法,该算法基本上将二项式分布应用于输入矢量的每个值,同时知道所有先前值。此处旨在为多个等位基因生成新的种群,知道初始种群。

要实现此目的,我正在使用此递归算法:
general formula recursive algorithm

这就是我的代码现在的样子:

void RandomNumbers::multinomial(std::vector<unsigned int>& alleleNumbers) {

/*  In this function we need two different records of the size.
 *  We need the size from the old populations, ( N - n1 - ... - nA )
 *  and we also need the size from the newly created population,
 *  ( N - k1 - ... - kA ).
 *  In order to achieve such a task, we'll use the integer "temp" to store
 *  the value n1 before modifying it to k1 and so on.
 *
 *
 */
double totalSize = 0;

for(auto n : alleleNumbers) totalSize+=n;

double newTotalSize(totalSize);

std::cout<< newTotalSize;

for(size_t i = 0; i < alleleNumbers.size(); ++i){
    size_t temp = alleleNumbers[i];
    alleleNumbers[i] = binomial(newTotalSize,
                (alleleNumbers[i])/(totalSize));
    newTotalSize-= alleleNumbers[i];
    totalSize = temp;  
  }
}

但是我对此一无所知,我想知道是否已经存在这种类型的多项式算法...

非常感谢您。

1 个答案:

答案 0 :(得分:1)

您可以尝试使用GNU科学图书馆的gsl_ran_multinomial命令。

该函数称为:

gsl_ran_multinomial (const gsl_rng * r, size_t K, unsigned int N, const double p[], unsigned int n[])

其中(n_1, n_2, ..., n_K)是具有sum_ {k = 1} ^ K n_k = N的非负整数,而(p_1, p_2, ..., p_K)是具有sum(p_i) = 1的概率分布。如果未对数组p[K]进行规范化,则其条目将被视为权重并进行适当规范化。数组n[]p[]的长度都必须为K

该函数实现了C.S. Davis的“计算机生成的多项随机变量”(比较统计数据分析,1993年,link)中的条件二项式方法,因此您可以使用该方法来实现。让我知道您是否需要纸质副本。