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++ 초보라 잘 모르겠습니다 ㅠㅠ 도와주세요.

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; //같은 값이 없을 경우 난수 재생성 종료
                }
            }
    
    

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

    • (•́ ✖ •̀)
      알 수 없는 사용자

ᕕ( ᐛ )ᕗ
로그인이 필요합니다

작성한 답변에 다른 개발자들이 댓글을 작성하거나 댓글에 좋아요/싫어요를 할 수 있기 때문에 계정을 필요로 합니다.