我正在尝试编写一种多项式算法,该算法基本上将二项式分布应用于输入 vector 的每个值,知道所有先前值。此处的目标是为多个等位基因生成一个新种群,从而知道初始种群。
为此,我使用了以下递归算法:
这就是我的代码现在的样子:
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;
}
}
但是我对此完全不确定,我想知道是否已经存在这种类型的多项式算法...
非常感谢你。
最佳答案
您可以尝试使用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的“计算机生成的多项随机变量”(Comp。Stat。Data Anal。16,1993. link)中的条件二项式方法,因此您可以使用该方法来实现。让我知道您是否需要纸的复印件。
关于c++ - C++多项式分布,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/53459990/