0

我必须运行一个模拟,其中每个事件 E_i 都有一定的概率 P_i 发生(i=1..4,sum_i P_i = 1)。

我想编写一个函数,将四个不同的概率(它们取决于我的模拟中发生的其他事情)作为输入,返回所选事件的整数 i。

哪个是编写这样一个函数的最佳方法(可能只使用标准库,我必须在我没有添加新库的权限的集群上运行它)?

我想写一些类似的东西:

int get_event(double p1,double p2, double p3, double p4){
    double r=((double) rand())/(RAND_MAX); // alternatively here there can be any function that
    // generates a random number uniformly distribute in (0,1);
    if (r<=p1) return 1;
    else if (r>p1 && r <=(p1+p2)) return 2;
    else if (r>(p1+p2) && r <=(p1+p2+p3)) return 3;
    else if (r>(p1+p2+p3) && r <=1) return 4;
    else return -1; // -1 is an en error code;
}

但我不确定这是否是最好的方法。有什么建议吗?提前非常感谢。

4

3 回答 3

3

这很好,我建议只做一些小的改动:

int get_event(double p1,double p2, double p3, double p4){
    double r=((double) rand())/(RAND_MAX);
    if (r<=p1) return 1;
    r-= p1;
    if (r<=p2) return 2;
    r-= p2;
    if (r<=p3) return 3;
    r-= p3;
    if (r<=p4) return 4;
    return -1; // -1 is an en error code;
}
于 2012-08-02T13:43:36.127 回答
3

有一种方法可以在 O(1) 时间内工作。

http://www.keithschwarz.com/darts-dice-coins/

http://www.altdevblogaday.com/2012/04/04/simulating-a-loaded-dice-in-a-constant-time

于 2012-08-02T13:46:25.340 回答
2

这是一个示例,您可以如何泛化您的代码,同时使其适用于更多的概率。我也将 eps 包括在比较中。

const double eps = 1e-9;
int get_event(double p[], int psize){
    double r=rand()/(RAND_MAX); // alternatively here there can be any function that
    // generates a random number uniformly distribute in (0,1);
    for (int i = 1; i <= psize; ++i) {
      r -= p[i-1];
      if (r < eps) {
        return i;
      }
    }
    return -1; // -1 is an en error code;
}
于 2012-08-02T13:46:54.567 回答