【问题标题】:C++; loop with randomizing array keys not workingC++;随机化数组键的循环不起作用
【发布时间】:2013-09-25 23:23:55
【问题描述】:

我遇到了一个我原本认为很容易解决的问题!

我有一个包含 4 个值(空、男性、女性、孩子)的枚举。我有一个对应于 50 个座位的数组。所以,我想根据随机生成的座位号将男人、女人和儿童放在空座位上。如果座位不是空的,那么程序应该继续搜索其他空座位。

这就是我所拥有的:

 #include <cstdlib>
 #include <ctime>
 #include <iostream>
 #include <string>

 using namespace std;

    enum pax {E, M, F, C};
    pax seats[50] = {E, E, E, E, E, E, E, E, E, E, E, E, E, E, E, E, E, E, E, E, E, E, E, E, E,
                    E, E, E, E, E, E, E, E, E, E, E, E, E, E, E, E, E, E, E, E, E, E, E, E, E};

    int paxNumMaleTotal;    // Total number of Male passengers Loaded
    int paxNumFemaleTotal;
    int paxNumChildTotal;

    void random(int j);


    int main()  {


    // Randomize seating for Male

    int n=1;
    int i=0;
    paxNumMaleTotal=35;
    paxNumFemaleTotal=8;
    paxNumChildTotal=5;

        while (n<= paxNumMaleTotal)  {  // loop until all men take their seats

            while (seats[i] != M || seats[i] != F || seats[i] != C)   {  
                   // take a seat unless the seat is not occupied
                 random(i);                 // generate a random seat to be taken
                 seats[i] = M;              // Seat is taken by a man
            }
            n++;  // seat is taken, take the next one

         }


     for (int k=0; k<50; k++)  {     // printing the seating chart
        cout << seats[k] << endl;
        }
 }

 void random(int j)     // this is the function that gives a random seat number
 {
    srand( time( NULL ) );
    j = rand() % 50;
 }

所以,我尝试了所有可能的选项。它要么让男性坐在所有 50 个座位上,要么像在这种情况下,把一个男人放在第一个座位上,没有环。非常感谢您的宝贵时间!

感谢您的帮助。使用参考,我解决了随机选择座位的问题。循环的问题仍然存在。它只选择一个席位(随机)而不是 35 个席位。 :-(


编辑:谢谢! random_shuffle 函数成功了!

for (int i=0; i < paxNumMaleTotal; i++)    {
        seats[i] = M;
}

for (int i = paxNumMaleTotal; i < paxNumFemaleTotal + paxNumMaleTotal; i++)    {
        seats[i] = F;
}

for (int i=paxNumFemaleTotal + paxNumMaleTotal; i < paxNumFemaleTotal + paxNumMaleTotal +
                            paxNumChildTotal; i++)  {
        seats[i] = C;
}

// Randomize seating for passengers
std::random_shuffle (&seats[0], &seats[49]);

【问题讨论】:

  • srand() 只能在应用程序中调用一次。在 main() 启动后调用一次。
  • 用所需数量的男性/女性/儿童填补座位然后使用std::random_shuffle 随机分配他们的位置可能更简单。

标签: c++ arrays loops random


【解决方案1】:

因此,其他人指出了您的随机函数签名中的小错误。

不过,可能有一种更简单的方法可以做到这一点。首先,用正确比例的乘客填充您的数组。只需使用几个 for 循环按顺序执行此操作,或者如果您愿意,可以使用更高级的方法。

然后使用 std::random_shuffle。它给你一个very reliable shuffleget it wrong有很多方法,所以最好使用经过良好测试的算法.. :)

【讨论】:

    【解决方案2】:

    目前您的 random() 函数没有返回任何内容。

    试试这个:-

    void random(int &j)
    

    编辑:-

    尝试使用std::random_shuffle 在用男性/女性填充所需的setas 后随机化位置

    【讨论】:

      【解决方案3】:

      通过 ref 发送参数

      void random(int &j);
      
      void random(int &j)
      {
         j = rand() % 50;
      }
      

      打电话

      srand(时间(NULL));

      主要。

      祝你好运。

      【讨论】:

        【解决方案4】:

        您的random() 函数不返回任何内容。您可能的意思是通过引用传递 j。

        【讨论】:

          【解决方案5】:

          这个:

          srand( time( NULL ) );
          j = rand() % 50;
          

          是问题所在。 time(NULL) 的分辨率为 1 秒。这会将您的随机生成器播种到几乎总是相同的值,因为外部循环比一秒快得多。

          解决方案:在程序开始时只初始化一次随机生成器。

          另外:您对j 的分配无效。您修改了参数的副本,并且永远不会返回此副本。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2017-01-05
            • 1970-01-01
            • 1970-01-01
            • 2013-10-28
            • 1970-01-01
            • 2014-04-27
            • 1970-01-01
            • 2015-09-03
            相关资源
            最近更新 更多