【问题标题】:define and use a discrete probability density function in c++在 C++ 中定义和使用离散概率密度函数
【发布时间】:2014-03-01 01:18:04
【问题描述】:

我想在 C++ 中为 n 个数字定义一个特定的概率密度函数 (pdf),然后稍后在我的代码中选择其中一些。

我的 pdf 是:P (x) = (1/logn) * f(x)^(-2)

f(x) 有一个确定性数字,在我的代码前面已经为每个 x 确定了。

我更喜欢使用标准库函数,因为我应该在计算机集群中使用我的程序,而使用其他库(例如 boost)更有可能在该集群中产生更多问题。

我找到的初始代码是:

  for(int x=1;x<n+1;x++){
    // I calculate all f(x) and therefore P(x) here
  }
  std::default_random_engine generator;
  std::discrete_distribution<int> distribution { .. not sure how to use P(x)s here .. };

  int prob[n]={};

  for (int i=0; i<n; ++i) {
    int number = distribution(generator);
    ++prob[number];
  }

非常感谢。

【问题讨论】:

  • 那么,可能的数字是 1 到 n 吗?或者这只是一个例子?
  • 抱歉耽搁了。是的,他们是 1 到 n。这是我的实际代码

标签: c++ math random distribution probability-density


【解决方案1】:

您现在可以构造带有权重的向量:

std::vector< double> weights( n);
for( int i = 0; i < n; ++i) {
  weights[i] = pdf( i + 1);
}

std::default_random_engine generator;
std::discrete_distribution<int> distribution( weights.begin(), weights.end()) ;

int prob[n]={};

for ( int i=0; i<n; ++i) {
  int number = distribution( generator);
  ++prob[number];
}

这将从 0 开始生成,这就是离散分布的工作方式,但您可以假设在不损失正确性的情况下为范围 1, ..., n 计算值(为 1, ..., n 计算权重)。

example

【讨论】:

  • 我失去了这样的想法,即通过准备好这个 pdf,我怎么能根据这个 pdf 选择一个从 1 到 n 的数字并将其分配给例如 j?
  • 我不明白。你能澄清一下吗?
  • 这实际上是一个非常介绍性的问题,但我很困惑。我的意思是,最后我如何根据这个分布生成一个从 i=1 到 n 的实例并说:int j = 生成的值。
  • int number = distribution(generator);将为您生成一个 [0,...,n-1] 范围内的数字,并且您知道该数字与您的原始域的对应关系。如果我从你提到的内容中得到正确的答案,那么你的域是 X=(1,...,n),那么你的映射是 f(n)=n+1=distribution(generator) + 1。例如:如果你有 2从呼叫分配(生成器)比你的号码是 3。
  • 非常感谢您的澄清
猜你喜欢
  • 2012-06-06
  • 1970-01-01
  • 2012-11-21
  • 2018-09-05
  • 1970-01-01
  • 2019-04-19
  • 1970-01-01
  • 2016-06-07
  • 1970-01-01
相关资源
最近更新 更多