2016-12-06 116 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是週期數。那麼我們做一個技巧,當s = 1000時,l(1Przedzialow)爲10^6,lLiczb = 16 * 1000 = 16000。 – Sarah

+0

我在這裏討論的是''''''''''''''''和''iLiczb''的定義。這些是輸入,'''lolizji'''的輸出。那麼您的評論中的輸入內容在哪裏?爲什麼它不遵循代碼的形式/約定? – 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,你可以嘗試一下,但考慮到這個數字越大,你的相互計算得到的精確度就越低,尤其是當雙重長度可能會或者可能不等於一個普通的雙倍時,取決於你的平臺。 –