Правильно сгенерировать случайное экспоненциальное значение С++

Я хочу сгенерировать случайное число, принадлежащее экспоненциальному распределению. я написал это

    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, и из-за того, что после того, как мне нужно выполнить линейную интерполяцию, я хочу уменьшить эти «пустые места», чтобы иметь хотя бы одно значение для каждого ячейка массива, как мне это сделать? например, у меня есть вектор 100000, только первые 60 полей заполнены значениями, поэтому все ячейки от 60 до 999999 равны 0, и когда я выполняю линейную регрессию, они отрицательно влияют на формулу.


person Domenico    schedule 29.03.2015    source источник
comment
Для вашего примера с заполнением 60, какой тип gamma вы использовали?   -  person Severin Pappadeux    schedule 30.03.2015
comment
Скажем, для gamma=1 quick на обратной стороне конверта calc показывает, что у вас будет менее 700 ячеек, заполненных двойным представлением (наименьшее двойное значение составляет около 10 ^ -308)   -  person Severin Pappadeux    schedule 30.03.2015
comment
@SeverinPappadeux, используя gamma = 0,01 и размер вектора 100000, теперь у меня есть более или менее 600 значений, и если я использую gamma = 0,3, у меня есть 49 значений.   -  person Domenico    schedule 30.03.2015
comment
@ gha.st есть другие способы?   -  person Domenico    schedule 30.03.2015
comment
@Domenico Стандартная библиотека C ++ содержит значительную часть генерации случайных чисел. Как вы можете видеть здесь, сюда входят экспоненциальные распределения, которые применимы в различные (P)RNG, например. MT19937.   -  person gha.st    schedule 30.03.2015
comment
@Domenico нажмите на ссылку, предоставленную byt gha.st. Он напрямую ссылается на соответствующую документацию стандартной библиотеки.   -  person Christophe    schedule 30.03.2015
comment
Вы должны решить, что делать, когда value >= size это не запись в недопустимый адрес памяти. Почему это массив double вместо массива int? Почему вы решили не использовать std::vector? (если это даже не пришло вам в голову, вам действительно следует привыкнуть думать об использовании std::vector в качестве решения по умолчанию для динамически выделяемых массивов)   -  person    schedule 30.03.2015


Ответы (1)


Хорошо, я вижу ошибку

Вы генерируете size количество событий. Вам действительно нужно больше событий, чтобы заполнить гистограмму

PS

Вероятность заполнения ячейки #n (n находится в диапазоне [0...размер)) определяется выражением

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

что для gamma равного 0,01 и, скажем, n около 1000 даст вам вероятность около 4*10^-7. Таким образом, чтобы получить хотя бы одно событие в этой корзине, вам потребуется выполнить выборку примерно 2,5 миллиона раз.

PPS

и использование библиотечной экспоненциальной выборки, хотя в целом это хорошо, ничего вам не купит, потому что, насколько я знаю, с выборкой все в порядке.

person Severin Pappadeux    schedule 29.03.2015
comment
да я понимаю, ко многим значениям все равно я найду другой путь. спасибо - person Domenico; 30.03.2015