2016-12-06 155 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,你可以尝试一下,但考虑到这个数字越大,你的相互计算得到的精确度就越低,尤其是当双重长度可能会或者可能不等于一个普通的双倍时,取决于你的平台。 –