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이 공식은 n = 2/2l이고, n은 난수의 수이고, l은주기 수이다. 260l = n^2 우리는 트릭을 수행합니다. = s^2 16s = n 그리고 s = 1000 일 때 l (lPrzedzialow)은 10^6이고 lLiczb = 16 * 1000 = 16000입니다. – Sarah
나는'''''''''''''''''''과''''''' 이것들은 투입물이며,''''콜리 지 '' '산출물이다. 그렇다면 댓글에 입력 된 내용은 무엇입니까? 코드의 형식/규칙을 따르지 않는 이유는 무엇입니까? – sascha