c++ 중복없는 난수생성
조회수 3694회
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; //같은 값이 없을 경우 난수 재생성 종료 } }
이렇게 코드를 바꿔보세요.
-
(•́ ✖ •̀)
알 수 없는 사용자
-
댓글 입력