2011-12-15 5 views
2

여덟 개 객체의 가방에서 무작위로 선택하는 프로그램을 작성하십시오.
각 개체는 빨간색, 파란색, 주황색 또는 녹색 일 수 있으며 볼 또는 큐브 일 수 있습니다.
가방에 각 조합에 대해 하나의 개체 (빨간색 공 1 개,
빨간색 큐브 1 개, 주황색 공 1 개, 주황색 큐브 1 개 등)가 있다고 가정합니다.
Example 5.3과 같이 두 개의 문자열 배열을 사용하여 코드를 작성하십시오. 하나는 색상을 식별하고 다른 하나는
모양을 식별하는 데 사용됩니다.C++ 반복하지 않고 무작위로 항목 수 선택

나는 위의 운동을 수행하는 프로그램을 작성하려고합니다. 문제는 매번 동일한 객체를 두 번 이상 선택할 수 있다는 것입니다.

는 지금까지

#include "stdafx.h" 
#include <iostream> 
#include <cstdlib> 
#include <ctime> 
#include <cmath> 
using namespace std; 

int rand_0toN1(int n); 
void choose_object(); 

char *colour[4] = 
    {"Red", "Blue", "Orange", "Green"}; 
char *object[2] = 
    {"Ball", "Cube"}; 

int main() 
{ 
    int n, i; 
    srand(time(NULL)); // Set seed for randomizing. 
    while (1) { 
     cout << "Enter no. of objects to draw "; 
     cout << "(0 to exit): "; 
     cin >> n; 
     if (n == 0) 
      break; 
     for (i = 1; i <= n; i++) 
      choose_object(); 
    } 
    return 0; 
} 
void choose_object() { 
    int c; // Random index (0 thru 4) into 
    // colours array 
    int o; // Random index (0 thru 2) into 
    // object array 
    c = rand_0toN1(4); 
    o = rand_0toN1(2); 
    cout << colour[c] << "," << object[o] << endl; 
} 

int rand_0toN1(int n) { 
    return rand() % n; 
} 
+3

표준 절차는, 그들 셔플, 가능성의 목록을 생성 한 후 (셔플) 순서로 사람들을 반환하는 것입니다 : 당신은 while() 루프에서 같은 것을 그것을 할 수 있습니다. –

+0

@MooingDuck 그건 내가 본 이런 종류의 표준이 아니야. 5 가지 옵션으로 10 가지 기준을 상상해보십시오 - 소수의 항목을 찾기 위해 거의 천만 가지 항목을 생성하고 싶습니까? : - \ – corsiKa

+0

@ 글로우 코더 : 대부분의 셔플은 거의 두어 이상이 없으며 다른 방법은 본 적이 없습니다. 분명히 잘 확장되지 않으며 많은 수의 경우 비표준 셔플 링 절차가 필요합니다. 너 뭐 봤어? –

답변

0

숙제, 나는 정확한 답을 줄 것,하지만 당신은 무엇을 할 수 있는지 설명하고 있지 않다된다

  1. 이미 선택한 개체의 목록을 유지합니다.
  2. 개체를 선택한 후에는 해당 개체를 이미 선택한 개체 목록과 비교하십시오. 목록에 있으면 다른 개체를 선택하십시오. 목록에없는 경우 목록에 추가하십시오.
  3. 는 8 개 이상의 오브젝트를 선택하지 않는, 또는 다른 당신이 당신의 choose_object() 서브 루틴에 갈 것

이 2 부에 무한 루프에 오게해야합니다.

int seen_before = 0; 
while(!seen_before) { 
    pick your random numbers 
    if(numbers not in list) { 
    add to list 
    break 
    } 
} 
+1

나는이 과정을 싫어한다. 이해하기 쉽지만 상당히 느립니다. 그런 다음 표준 셔플을 반복하는 것이 훨씬 빠릅니다. –

+1

전체 세트의 일부분 만 선택하는 경우 이는 내가 언급 한 셔플보다 훨씬 빠릅니다. –

+0

Mooing Duck이 말한 것처럼 목록을 뒤섞기를 선호합니다. 비록 이것이 끝이없는 반복에서 끝나는 느낌을 없애기 만해도 말입니다. – pezcode

2

코드의 실제 세계 비유를함으로써이 문제를 해결 해보자이다

이의 당신이 구슬의 거대한 항아리 있다고 가정 해 봅시다, 위의 색상. 너무 무거워서 (무한 크기입니다!) 매번 주어진 색상의 대리석을 그릴 때마다 항상 같은 기회를 가질 수 있습니다.

실생활에서 어떻게합니까? 무작위로 따기를 계속 하시겠습니까? 대리석을 그릴 때 그 대리석을 버리시겠습니까? 아니면 당신이 이미 그려 놓은 것들을 조금씩 지키고 싶습니까?

아니면 단지 항아리에 각각 하나만있을 수도 있습니다 ... 당신은 그것을 다시 넣지 않을 것입니까? 그것은 당신이 여기에서하는 일종의 것이기 때문입니다.

이러한 각각의 생각 경로는 좋은 해결책을 제시합니다. 이런 종류의 과제물은 컴퓨터처럼 생각하는 법을 가르쳐주는 것이기 때문에 코드 또는 아무것도 제공하고 싶지 않습니다. 이 이후

관련 문제