我找到了一些概率,其总和不给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 ..
在这种情况下是否还有其他可用的方法?
答案 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。太棒了。
祝你好运!