Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/ssh/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ C++;选择多个随机项目而不重复_C++ - Fatal编程技术网

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

C++ C++;选择多个随机项目而不重复,c++,C++,编写一个程序,从一袋8个对象中随机选择。 每个对象可以是红色、蓝色、橙色或绿色,也可以是球或立方体。 假设袋子中每个组合包含一个对象(一个红色球,一个 红色立方体、一个橙色球、一个橙色立方体等)。编写类似于 示例5.3,使用两个字符串数组,一个用于识别颜色,另一个用于 识别形状 我正试图编写一个程序来执行上述练习——我遇到的问题是,同一个对象每次可以选择多次 这是到目前为止的代码 #include "stdafx.h" #include <iostream> #include <

编写一个程序,从一袋8个对象中随机选择。
每个对象可以是红色、蓝色、橙色或绿色,也可以是球或立方体。
假设袋子中每个组合包含一个对象(一个红色球,一个
红色立方体、一个橙色球、一个橙色立方体等)。编写类似于
示例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;
}
#包括“stdafx.h”
#包括
#包括
#包括
#包括
使用名称空间std;
内部随机变量1(内部随机变量n);
void选择_对象();
字符*颜色[4]=
{“红色”、“蓝色”、“橙色”、“绿色”};
char*对象[2]=
{“球”,“立方体”};
int main()
{
int n,i;
srand(time(NULL));//设置随机化种子。
而(1){
cout n;
如果(n==0)
打破

对于(i=1;i让我们尝试通过现实世界的类比来解决这个问题:

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

在现实生活中你会怎么做?你会一直随机挑选,在画大理石的时候把它扔掉吗?或者你会保留一些你已经画过的东西的清单吗

或者你在罐子里只有一个……你不会把它放回去吧?因为你在这里就是这么做的


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

由于这是作业,我不打算给出确切的答案,但请描述你能做什么:

  • 保留已选择对象的列表
  • 选择对象后,将该对象与已选择的对象列表进行比较。如果该对象在列表中,请选择另一个对象。如果该对象不在列表中,请将其添加到列表中
  • 确保不要尝试选择8个以上的对象,否则在第2部分中会出现无限循环
  • 这些将进入您的
    choose\u object()
    子例程。您可以在
    while()
    循环中执行,类似于:

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

    标准的过程是生成一个可能性列表,将它们洗牌,然后返回(洗牌)中的那些可能性顺序。@MooingDuck在我见过的任何一种情况下都不是标准的。想象一下10个标准,每个标准有5个选项-你想生成近1000万个条目来找到一把吗?:-\@glowcoder:大多数洗牌很少有超过几百个,我从来没有见过任何其他方式。显然,它的扩展性不好,对于大的数字,你会发现需要一个非标准的洗牌程序。你看到了什么?谢谢你的快速回答-不要认为我把问题说得很清楚-我在上周才开始尝试从一本书中自学,所以如果这没有多大意义,请道歉-如果我选择5,例如som,程序会要求从包中挑选一些对象有时我会得到不止一个相同的组合,例如红色、球红色、球-这就是我试图过滤的out@Duck我已经看到在一些事情上实现了这一点(例如洗牌)。对于这类事情没有标准的程序。你会注意到,在我的回答中,我暗示该解决方案是我的备选方案,而主要的选择是在运行过程中存储你选择的内容。这会导致相同的缩放问题,只是它会根据你选择的内容而不是问题空间的大小进行缩放。我不这么认为就像这个过程一样。虽然简单易懂,但速度相当慢。标准的随机播放然后迭代速度要快得多。如果你只选择整个集合的一小部分,这比我提到的随机播放速度快得多。我更喜欢像穆林鸭说的那样随机播放列表,即使只是为了摆脱这样可能会以一个en结尾的感觉是的,这就是为什么我在这里把摩尔鸭子的评论都投了赞成票。