2012-09-22 4 views
4

셔플이 필요한 표준 : 벡터가 있습니다. 크기는 ~ 20 명에 불과합니다. 또한 프로그램을 실행할 때마다 다른 셔플을 생성해야합니다.셔플 벡터 (C++)

지금은 random_shuffle을 사용하고 있지만, 프로그램을 실행할 때마다 동일한 결과가 나타납니다. 그러나 this 스레드에서 제안 된 srand(unsigned(time(NULL)));을 시도했지만 플랫폼에서 작동하지 않습니다.

가능한 경우 표준 코드 만 사용하고 싶습니다.

편집 : 도움이되지 않습니다

vector<Tile>gameTiles; 
gameTiles.push_back(Tile(0,0)); 
gameTiles.push_back(Tile(0,1)); 
gameTiles.push_back(Tile(0,2)); 
gameTiles.push_back(Tile(0,3)); 
gameTiles.push_back(Tile(0,4)); 
//etc. ~20 member 

random_shuffle(gameTiles.begin(), gameTiles.end()); 
+0

이 [예제] (http://www.cplusplus.com/reference/algorithm/random_shuffle/)에서 좋아 했습니까? 나는 그것이 효과가 있고, 모든 표준이다라고 꽤 확신한다. – luk32

+1

또한 코드를 보는 것이 좋을 것입니다. –

+1

2 가지를 섞어서 작동하지 않는 것으로 생각하십니까? – Rapptz

답변

10

srand(unsigned(time(NULL))); 경우, 구현이 난수 생성기로 표준 rand()를 사용해서는 안 : 여기 내 구현입니다. 이 경우 사용자 지정 임의 번호 생성기를 사용하는 random_shuffle의 대체 버전이 있습니다. ,

int MyRand(int n) 
{ 
    return std::rand() % n; 
} 

// ... 
std::random_shuffle(bar.begin(), bar.end(), MyRand); 
// ... 

는보다 균일 한 분포 뭔가를하려는 경우 C++ (11) <random> 헤더에 보면 : 당신은 다음과 같이 rand() 주위에 래퍼를 전달할 수 있습니다.

+0

그래, 표준'rand()'을 사용해서는 안되는 것 같습니다. 이 래퍼는이 프로젝트를 완벽하게 처리합니다. 응답 해 주셔서 감사합니다. –

0

잘 구현하면 작동하지 않습니다 (유형을 foo로 지정하고 동일한 리터럴을 변수로 사용했습니다). 어쨌든 그것은 random_shuffle 표준 rand를 사용하고 제대로 초기화되어 있는지 확인한다이

// random generator function: 
ptrdiff_t myrandom (ptrdiff_t i) { return rand()%i;} 
// pointer object to it: 
ptrdiff_t (*p_myrandom)(ptrdiff_t) = myrandom; 

int main(void){ 
    srand(0) 
    vector<Tile>gameTiles; 
    gameTiles.push_back(Tile(0,0)); 
    gameTiles.push_back(Tile(0,1)); 
    gameTiles.push_back(Tile(0,2)); 
    gameTiles.push_back(Tile(0,3)); 
    gameTiles.push_back(Tile(0,4)); 
    random_shuffle(gameTiles.begin(), gameTiles.end(), p_myrandom); 
} 

같은 것을보십시오. 같은 초에 두 번 응용 프로그램을 실행하지 않으면 결과가 달라져서 rand에 동일한 시드를 사용하게됩니다. 코드를 바로 here에서 바꿀 수 있지만 변경된 사항이 있으므로 방금 사용했습니다.