0

各イベントE_iに特定の確率P_iが発生するシミュレーションを実行する必要があります(i = 1..4、sum_i P_i = 1)。

4つの異なる確率(シミュレーションで発生する他の事柄に依存します)を入力として受け取り、選択したイベントの整数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

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 に答える
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 に答える
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 に答える