Я хочу сгенерировать случайное число, принадлежащее экспоненциальному распределению. Я написал это
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, а когда я выполняю линейную регрессию, они отрицательно влияют на формулу.
Хорошо я вижу ошибку
Вы генерируете size
количество событий. Вам действительно нужно больше событий, чтобы заполнить гистограмму
PS
Вероятность заполнения бункера #n (n находится в диапазоне [0 … размер)) определяется выражением
prob = exp(-gamma*n) - exp(-gamma*(n+1))
который для gamma
равен 0,01 и, скажем, n
около 1000 даст вам вероятность около 4*10^-7
, Таким образом, чтобы получить хотя бы одно событие в этой корзине, вам нужно сделать выборку примерно в 2,5 миллиона раз.
PPS
и использование экспоненциальной выборки из библиотеки, хотя в целом это хорошо, ничего не купит, потому что, насколько я знаю, выборка в порядке