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

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

    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, а когда я выполняю линейную регрессию, они отрицательно влияют на формулу.

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

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

0

Другие решения


По вопросам рекламы [email protected]