c++ 중복없는 난수생성


srand((unsigned)time(NULL)); //프로그램을 실행시킬때마다 다른 난수 생성
int found1, found2;
string fruit_1[8], fruit_2[8];
string fruit[8] = { "사과","사과","포도","포도","참외","참외","귤","귤" };
for (int i = 0; i < 8; i++) {
    while (1) {
        fruit_1[i] = fruit[rand() % 8];
        found1 = 0;
        for (int j = 0; j < i; j++) {
            if (fruit_1[j] == fruit_1[i])
                found1 = 1;
        }
        if (found1 == 0)break; //같은 값이 없을 경우 난수 재생성 종료
    }

    while (1) {
        fruit_2[i] = fruit[rand() % 8];
        found2 = 0;
        for (int j = 0; j < i; j++) {
            if (fruit_2[j] == fruit_2[i])
                found2 = 1;
        }
        if (found2 == 0)break; //같은 값이 없을 경우 난수 재생성 종료
    }
    p[i].set_fruit1(fruit_1[i]);
    p[i].set_fruit2(fruit_2[i]);
    cout << p[i].get_name() << " 과일1-" << p[i].get_fruit1() << " 과일2-" << p[i].get_fruit2() << endl;
}

플레이어 당 두 개씩 랜덤으로 과일을 배정하는 코드인데 이 코드 다음 문장이 실행이 안되서요.. C++ 초보라 잘 모르겠습니다 ㅠㅠ 도와주세요.

  • 2017년 12월 08일에 작성됨

조회수 348


Hashcode banner summercoding

1 답변


    for (int i = 0; i < 8; i++) {
        while (1) {
            fruit_1[i] = fruit[rand() % 8];
            found1 = 0;
            for (int j = 0; j < i; j++) {
                if (fruit_1[j] == fruit_1[i])
                    found1 = 1;
            }
            if (found1 == 0){
                break; //같은 값이 없을 경우 난수 재생성 종료
            }

에서는

하나. fruit_1[i] = fruit[rand() % 8];으로 랜덤한 과일이름을 하나 가져온 후, 둘-1. while룹에서 fruit_1에 같은 과일이 있으면 과일을 다시 뽑습니다. 둘-2. while룹에서 fruit_1에 같은 과일이 없다면 과일을 배열에 넣습니다.. 셋. 위 과정을 8번 반복(int i = 0; i < 8; i++) 합니다.

문제는 string fruit[8] = { "사과","사과","포도","포도","참외","참외","귤","귤" }; 에는 같은 값의 원소가 2개씩 들어있습니다.

따라서 i = 4가 되었을 때, fruit_1에는 "사과", "포도", "참외", "귤"이 모두 들어있어, 이 이후에는 fruit_1[i] = fruit[rand() % 8];fruit_1에 들어있는 값을 뽑을 수 밖에 없습니다. 따라서 새로운 값을 뽑지 못해서, found1 == 0에 걸리지 못해, 무한루프가 뜹니다.


혹시

fruit_1 = {"사과", "포도","사과","포도","참외","귤","귤","참외"} 이런식으로 fruit_1에 각 과일을 2번씩 랜덤한 순서로 담고싶은거면

        while (1) {
            fruit_1[i] = fruit[rand() % 8];
            found1 = 0;
            for (int j = 0; j < i; j++) {
                if (fruit_1[j] == fruit_1[i])
                    found1 ++;
            }
            if (found1 <= 1){
                break; //같은 값이 없을 경우 난수 재생성 종료
            }
        }

이렇게 코드를 바꿔보세요.

  • 알 수 없는 사용자

로그인이 필요한 기능입니다.

Hashcode는 개발자들을 위한 무료 QnA사이트 입니다. 작성한 답변에 다른 개발자들이 댓글을 작성하거나 좋아요/싫어요를 할 수 있기 때문에 계정을 필요로 합니다.
► 로그인
► 계정만들기
Close