2012-04-11 4 views
7

내가 ...로는 다음 수업 시간에 내가 메인에서 호출 그러나임의의 숫자가

class foo{ 
    int bar::randomNum10to50(){ 
     srand (time(NULL)); 
     int random10to50 = rand()%50+10; 
     return random10to50; 
    } 
} 

을하는 방법이 (다만, 출력을 확인 이 프로그램은 내가 ...과 같이)

예상 정확히 같은 수의 IT를 실행할 것마다 (즉, 9,9,9,9,9, ..., 다음 실행 : 43, 43,43,43, .....) 나는 무엇이 잘못 될지 모른다. 코드가 매우 빨리 실행되므로 문제가 될 수도 있지만 20 번의 반복 작업간에 차이가없는 이유를 알 수 없습니다. 어떤 생각이라도 감사드립니다! 감사!

+0

"9,9,9,9,9"는 '오타'오른쪽했다? 나는 단지 10 ~ 50의 범위에서 결과를 얻어야하기 때문에 궁금합니다. – jorey

답변

20

당신은 srand(), 랜더 마이저 기능의 외부에서 호출 할 필요가있다. 그렇지 않으면, 매번 동일한 시간 값으로 난수 생성기를 다시 시드하여 동일한 초기 "임의"값을 생성합니다.

+0

gotch ... 고마워요! 나는 지금 바보 같아. –

6

시간이 실제로 변경 될 시간이 없으므로 루프 반복마다 동일한 시드로 srand()을 호출하고 있습니다. 한 번만 호출하면 모든 것이 작동합니다.

3

코디 그레이는 이미 여기에서 잘못하고 있지만, 여기에 <random> 라이브러리와 함께이 일의 예하는지 말한다 :

rand()%50 + 10 10 59이 아니라 10의 범위에 숫자를 생성하는 것으로
#include <random> 

std::mt19937 make_seeded_engine() { 
    std::random_device r; 
    std::seed_seq seed{r(), r(), r(), r(), r(), r(), r(), r()}; 
    return std::mt19937(seed); 
} 

class foo { 
    std::mt19937 engine; 

public: 
    foo() : engine(make_seeded_engine()) {} 

    int randomNum10to50(){ 
     return std::uniform_int_distribution<>(10,50)(engine); 
    } 
}; 

foo create; 
for (int i=0; i<20;i++){ 
    cout << create.randomNum10to50() << '\n'; 
} 

50. uniform_int_distribution은 당신이주는 범위가 당신이 얻는 범위이기 때문에 더 낫다. 그래서 당신은 엉망이 될 가능성이 적다. 또한 uniform_int_distribution을 사용하면 편향된 결과를 얻지 만 rand()%50+10에는 약간의 바이어스가 있습니다.


당신이 좀 더 C++ 11 지원 컴파일러이있는 경우 수행 할 수 있습니다

class foo{ 
    std::mt19937 engine = make_seeded_engine(); 

public: 
    int randomNum10to50(){ 
     return std::uniform_int_distribution<>(10,50)(engine); 
    } 
}; 
+0

멋진! 감사! 나는 그것을 사용하게 될지도 모른다. 좋은 정보! –

+0

컴파일러는 C++ 11을 지원해야합니다. 그렇지 않으면 부스트를 사용할 수 있습니다. 여기서 ''이 나오는 것으로 믿습니다. – AJG85

+0

@ AJG85 그래, 일부 C++ 11을 사용하고 있지만, 널리 지원되는 것에 국한시키는 것에주의했다. VS11과 gcc는 4.5를 거슬러 올라갈 수 있습니다. 하지만 조금 더 청소하기 위해 C++ 11을 사용하는 버전을 추가 할 것입니다 ... – bames53

관련 문제