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は周期数です。 260l = n^2私たちはトリックl = s^2 16s = nを行い、s = 1000の場合、l(lPrzedzialow)は10^6であり、lLiczb = 16 * 1000 = 16000である。 – Sarah
ここでは '' lPrzedzialow'''と ''iLiczb''の定義についてお話しています。これらは入力であり、 '' lKolizji''という出力です。だからあなたのコメントの入力はどこですか?なぜコードの形式/規則に従わないのですか? – sascha