2016-12-06 13 views
0

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; 
    } 
+0

いくつかのパラメータ出力例を示します(「良い」ケース、「悪い」ケース)。私は上記のパラメータのために254の数を期待します。 128を期待する方法を説明することができますか? – sascha

+0

良い出力: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

+0

ここでは '' lPrzedzialow'''と ''iLiczb''の定義についてお話しています。これらは入力であり、 '' lKolizji''という出力です。だからあなたのコメントの入力はどこですか?なぜコードの形式/規則に従わないのですか? – sascha

答えて

1

この数値は、10000000000は32ビット整数では大きすぎます。実際、それは1,410,065,408に相当し、それはあなたが信じているサイズの約1/7です。

+0

long long intを使用するべきですか?カウントが始まる前にプログラムがクラッシュする – Sarah

+0

@Sarah次に、サポートされているタイプのコンパイラをチェックしてください。極端な場合は、常に[GNU MP](https://gmplib.org/)があります。 – sascha

+0

@Sarah、あなたはそれを試すことができますが、その数値が大きくなるほど、逆算の精度は低くなります。特に、あなたのプラットフォームによっては、倍の長さが普通の倍数に等しいかそうでない場合があります。 –