1

指数分布に属する乱数を生成したい。私はこれを書きました

    int size = atoi(argv[2]);
    double *values = (double*)malloc(sizeof(double)*size);

    double gamma = atof(argv[1]);
    if(gamma<=0.0){
        cout<<"Insert gamma"<<endl;
        return 0;
    }


    for(int i=0; i<size; i++){
        values[i]=0;

    }

    srand ( time(NULL) );
    for(int i=0; i<size; i++){
        x = ((double) rand() / (RAND_MAX));
        //cout << random <<endl;
        value=(log(1.0-x)/(-gamma));
        //count each value
        values[value]=values[value]+1.0;
    }

しかし、ベクトルのすべてのサイズをカバーしているわけではありません。多かれ少なかれそれらはベクトルの 10% をカバーし、他のフィールドはすべて 0 であり、線形補間を行う必要があるため、それぞれに少なくとも 1 つの値を持たせるために、これらの「空のスペース」を減らしたいと考えています。配列のセル、どうすればできますか? たとえば、100000 のベクトルがある場合、最初の 60 フィールドのみに値が入力されるため、60 から 999999 までのセルはすべて 0 になり、線形回帰を実行すると、式に悪影響を及ぼします。

4

1 に答える 1

0

わかりました、バグが見つかりました

あなたは多くのイベントを生成sizeしています。ヒストグラムを埋めるにはもっと多くのイベントが必要です

PS

フィル ビン #n (n は [0...size) の範囲内) の確率は次の式で与えられます。

prob = exp(-gamma*n) - exp(-gamma*(n+1))

これはgamma0.01 に等しく、たとえば n約 1000 の場合、約 の確率が得られます4*10^-7。したがって、このビンでイベントを 1 つでも取得するには、約 250 万回サンプリングする必要があります。

PPS

ライブラリの指数サンプリングは一般的には良いですが、何も購入しません。私が知る限り、サンプリングは問題ないからです。

于 2015-03-29T23:18:12.563 に答える