rand_r에 문제가 있습니다. 수백만 개의 난수를 생성하는 시뮬레이션이 있습니다. 나는 어느 시점에이 수치가 더 이상 일정하지 않다는 것을 알았다. 무엇이 문제 일 수 있습니까?수백만 개의 난수가 생성되었습니다. "오버플로"rand_r?
내가하는 일 : 나는 생성기의 인스턴스를 만들고 자신의 씨앗을 제공합니다.
class nativeRandRUni {
public:
unsigned seed;
nativeRandRUni(unsigned sd){ seed= sd; }
float genP() { return (rand_r(&seed))/float(RAND_MAX); } // [0,1]
int genI(int R) { return (rand_r(&seed) % R); } // [0,R-1]
};
숫자는 단순히 의해 생성됩니다 :
newIntNumber= mainRGen->genI(desired_max);
newFloatNumber= mainRGen->genP();
시뮬레이션 문제는 위의 설명이 여기
mainRGen= new nativeRandRUni(idumSeed_g);
클래스/객체 데프이다. 나는 이것이 내가 결과를 서명 (결과를 참조하십시오 상단 이미지,
http://ubuntuone.com/0tbfidZaXfGNTfiVr3x7DR)
도 표시됩니다 시간 이후에 생성 된 숫자의 분포를 확인한 원인은 내가 t에서 씨앗을 인쇄하는 경우 -1과 t는 시그니처의 시점이고, 시드 값이 263069042에서 1069048066으로 변하는 것을 볼 수 있습니다.
다른 시드로 코드를 실행하면 문제는 항상 존재하지만 다른 시간 지점에서
또한 내 객체 대신에 rand()를 사용하면 모든 것이 잘됩니다 ... 객체를 사용해야 할 때가 있습니다. 스레드를 사용하는 경우가 있습니다. 위의 예는 스레드가 없습니다.
나는 정말로 여기에서 잃어버린 단서가 있습니까?
편집 - 충분히 시간을 반복하여 재현 할 수 편집
는, 문제는 내가 말했듯이,이 발생하는 문제에 대한 반복의 수백만을 소요한다는 것입니다. 시드 -158342163에 대해 나는 세대 t = 134065568에 그것을 얻는다. 하나는 (유니폼)과 (유니폼이 아닌) 후에 생성 된 번호를 확인할 수 있습니다. 주어진 t에서 수동으로 시드를 변경하면 동일한 문제가 발생합니다 (코드에서 (*) 참조). 나는 또한 일어날 것을 기대하지 않는다?
#include <tr1/random>
#include <fstream>
#include <sstream>
#include <iostream>
using std::ofstream;
using std::cout;
using std::endl;
class nativeRandRUni {
public:
unsigned seed;
long count;
nativeRandRUni(unsigned sd){ seed= sd; count=0; }
float genP() { count++; return (rand_r(&seed))/float(RAND_MAX); } // [0,1]
int genI(int R) { count++; return (rand_r(&seed) % R); } // [0,R-1]
};
int main(int argc, char *argv[]){
long timePointOfProblem= 134065568;
nativeRandRUni* mainRGen= new nativeRandRUni(-158342163);
int rr;
//ofstream* fout_metaAux= new ofstream();
//fout_metaAux->open("random.numbers");
for(int i=0; i< timePointOfProblem; i++){
rr= mainRGen->genI(1009200);
//(*fout_metaAux) << rr << endl;
//if(i%1000==0) mainRGen->seed= 111111; //(*) FORCE
}
//fout_metaAux->close();
}
는이 이상을 표시하는 기능이있는 작은 프로그램을 작성할 수 있습니까? 10' 정도 - – rodrigo
당신은'timePointOfProblem에서 seed''의 가치를 게시 할 수 있을까요? 134mil 반복 작업을하지 않고도 장면 뒤에서 진행되는 작업을 더 빠르게 볼 수 있습니다. –