C ++选择多个随机项而不重复

时间:2011-12-15 23:04:40

标签: c++

  

编写一个程序,从一包八个物体中随机选择   每个物体可以是红色,蓝色,橙色或绿色,也可以是球形或立方体   假设每个组合包含一个物体(一个红球,一个红色   红色立方体,一个橙色球,一个橙色立方体,等等)。编写类似于的代码   例5.3,使用两个字符串数组 - 一个用于识别颜色,另一个用于识别颜色   识别形状。

我正在尝试编写一个程序来执行上述练习 - 我遇到的问题是每次都可以多次选择相同的对象。

这是到目前为止的代码

#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;
}

2 个答案:

答案 0 :(得分:2)

让我们试着通过一个真实的世界类比来解决这个问题:

假设你有一大块大理石,上面列出的颜色。它是如此巨大(无限大小!),你总是有同样的机会画一个给定颜色的大理石,每次总是1/4。

你将如何在现实生活中做到这一点?您是否只是随意挑选,在绘制时将大理石拉开?或者你可能会保留一些你已经画过的东西?

或者也许你在罐子里只有一个......你不会把它放回去吗?因为那就是你在这里所做的一切。

这些思路中的每一条都将引导您找到一个好的解决方案。我不想提供代码或任何东西,因为这种分配教会你如何像计算机一样思考。

答案 1 :(得分:0)

由于这是作业,我不打算给出确切的答案,而是描述你可以做的事情:

  1. 保留您已选择的对象列表。
  2. 选择对象后,将该对象与您已选择的对象列表进行比较。如果它在列表中,请选择其他对象。如果它不在列表中,请将其添加到列表中。
  3. 确保您不要尝试选择超过8个对象,否则您将在第2部分中以无限循环结束。
  4. 这些将放在你的choose_object()子程序中。您可以在while()循环中执行此操作,例如:

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