我期待lkolizji變量在128左右,但是對於大量的生成數字和「盒子」來說,它要高得多。較小數字的結果很好。我不知道爲什麼會發生這種情況。這裏是我的代碼,帶有錯誤答案的示例參數。好結果(約128)的示例是int lPrzedzialow = 1000000; int iLiczb = 16000;隨機數發生器碰撞測試中碰撞太多
#include <iostream>
#include <gsl/gsl_rng.h>
#include <stdlib.h>
#include<cmath>
#include <algorithm>
using namespace std;
int main (void)
{
//Random number
unsigned int seed=2596524;
gsl_rng * r=gsl_rng_alloc (gsl_rng_mt19937);
gsl_rng_set(r,seed);
gsl_rng_env_setup();
//Parameters
int lPrzedzialow=10000000000;//number of boxes
int iLiczb = 1600000;//number of random numbers
int z,lKolizji=0;//lKolizji holds collision number
vector<int> lwKomorkach(iLiczb);//number of boxes of random numbers
long double dlPrzedzialu=1./(lPrzedzialow);
//number of box of a random number
for (int i = 0; i < iLiczb; i++)
{
lwKomorkach[i] = floor((gsl_rng_uniform (r)/dlPrzedzialu));
}
//sorting
sort(lwKomorkach.begin(), lwKomorkach.end());
//how many collisions
for(z=0;z<=iLiczb-1;z++)
{
if(lwKomorkach[z+1]==lwKomorkach[z]){lKolizji++;}
}
double pdf[lKolizji];
pdf[0]=exp(-128);
double spdf=exp(-128);
for(int h=1;h<lKolizji;h++){
pdf[h]=pdf[h-1]*128./(h);
spdf+=pdf[h];
}
double pwyzsze=1.-spdf;
cout<<endl<<lKolizji<<" "<<spdf<<" "<<pwyzsze<<endl;
gsl_rng_free (r);
return 0;
}
給出一些參數輸出示例(「好」案例;「壞」案例)。我期望上面的參數爲254。所以也許你可以解釋你如何期待128? – sascha
好輸出:133 0.66 0.34,差輸出:448 1 3 * 10 ^( - 16)。我們需要碰撞數128.對於這個128 = n^2/2l的等式,其中n是隨機數的數目,並且l是週期數。那麼我們做一個技巧,當s = 1000時,l(1Przedzialow)爲10^6,lLiczb = 16 * 1000 = 16000。 – Sarah
我在這裏討論的是''''''''''''''''和''iLiczb''的定義。這些是輸入,'''lolizji'''的輸出。那麼您的評論中的輸入內容在哪裏?爲什麼它不遵循代碼的形式/約定? – sascha