C++ 使用什么概率函数

C++ 使用什么概率函数,c++,c,algorithm,math,probability-density,C++,C,Algorithm,Math,Probability Density,我想在向量中按排序顺序从“e”边中概率地选择“n”边。 但我想用概率来选择。我也不想在开始的时候选择大的边缘 这就像在开始时给较小的边赋予更多的权重,当我取边时, 我会给更大的剩余边缘越来越多的权重 我应该选择n和e的什么概率函数 while( edgesTaken < n ) { for each edge i and edgesTaken < n probability = pdf( edgesTaken, i) if ( prob

我想在向量中按排序顺序从“e”边中概率地选择“n”边。 但我想用概率来选择。我也不想在开始的时候选择大的边缘

这就像在开始时给较小的边赋予更多的权重,当我取边时, 我会给更大的剩余边缘越来越多的权重

我应该选择n和e的什么概率函数

while( edgesTaken < n ) {
     for each edge i and edgesTaken < n
         probability = pdf( edgesTaken, i)
         if ( prob > THRESHOLD )
              take the edge
 }
while(edgesTaken阈值)
占优势
}

您需要分位数函数来实现所需的分布。使用标准生成器绘制一个随机数,得到均匀分布在[0,1]中的q。然后调用以q为参数的分位数函数。生成的随机集将具有所需的分布。

第一条边为1的概率为choose(n-1,e-1)/choose(n,e)

更一般地,第一条边为k的概率为 [选择(n-k,e-1)/选择(n,e)]*1/k

您可能还需要1-k中正好有一条边的概率: [选择(n-k,e-1)/选择(n,e)]

从这里我想你可以把一切都结束了


顺便解释一下,这三个函数给出了选择满足其条件的边的方法数量的比率,选择(n,e),这是从n中选择e边的方法数量。

我看了正态分布,但将x替换为I_边,将sigma^2替换为edgesTaken,将f(x)对于大的i_边来说非常小。它可以是正态分布的CDF吗?图不一定只有这样。它只是我的表示。它应该考虑到上面的限制,慢慢地给大边一个更多的权重(未测试)可能性:从边缘
0
,以概率
((n-edgesTaken)/(e-i))**(1/7)获取边缘
i
。您可以在空闲时调整
7
,较高的值将有利于较低值的边。我的n和e在哪里拟合?您的分位数函数将是n和e的函数。从我的学习中,我发现分位数给出了给定分布的点和CDF的百分比,它告诉了CDF与之交叉的点百分比。我不明白如何在这里应用你的q、n和e。?这里的n总是小于或等于e。你的解决方案中的k是什么?这是从OP中切换出来的
n
e
(公平地说,
n
通常是一个总数,而不是
e
).
k
是选择的第一条边。但我不认为这有利于小边。是的,我切换了n和e。哦,我将保持原样。这不利于任何边,只是假设所有边都以相同的概率选择,那么第一条边的概率是k。这样做足以使第一条边看起来很小只要选择了多条边。我不清楚OP想要的是更华丽的东西。我认为OP想要选择边
k
的概率大于选择边
k+1
的概率。但最好有比草图更具解释性的东西。