随机数发生器碰撞试验中的碰撞太多

时间:2016-12-06 20:45:33

标签: c++ for-loop random generator gsl

我希望lKolizji变量大约为128,但对于大量生成的数字和" box"它要高得多。较小数字的结果是好的。我不知道为什么会这样。这是我的代码,其示例参数给出了错误的答案。良好结果的例子(大约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;
  }

1 个答案:

答案 0 :(得分:1)

这个数字:10000000000,对于32位int来说太大了。事实上,它相当于1,410,065,408,大约是你认为它的1/7。