2016-12-06 4 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이 공식은 n = 2/2l이고, n은 난수의 수이고, l은주기 수이다. 260l = n^2 우리는 트릭을 수행합니다. = s^2 16s = n 그리고 s = 1000 일 때 l (lPrzedzialow)은 10^6이고 lLiczb = 16 * 1000 = 16000입니다. – Sarah

+0

나는'''''''''''''''''''과''''''' 이것들은 투입물이며,''''콜리 지 '' '산출물이다. 그렇다면 댓글에 입력 된 내용은 무엇입니까? 코드의 형식/규칙을 따르지 않는 이유는 무엇입니까? – sascha

답변

1

이 숫자는 10000000000이며 32 비트 int에는 너무 큽니다. 실제로 이것은 1,410,065,408에 해당합니다. 크기의 1/7 정도입니다.

+0

그래서 long long int를 사용해야합니까? 그 다음 카운트하기 시작하기 전에 내 프로그램이 충돌합니다 – Sarah

+0

@Sarah 그러면 지원되는 유형의 컴파일러를 확인하십시오. 극단적 인 경우에는 항상 [GNU MP] (https://gmplib.org/)가 있습니다. – sascha

+0

@Sarah, 시도해 볼 수는 있지만 그 숫자가 클수록 정확도가 떨어집니다. 특히 플랫폼에 따라 긴 double이 일반 double과 같거나 같지 않을 수도 있습니다. –