C++;循环随机化数组键不起作用

标签 c++ arrays loops random

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

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

这是我的:

 #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( time( NULL ) );
j = rand() % 50;

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

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

此外:您对 j 的赋值无效。您修改参数的拷贝,此拷贝永远不会返回。

关于C++;循环随机化数组键不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18919025/

相关文章:

c++ - $ 符号导致程序崩溃

arrays - ReDim (VBA) 下标超出范围

c++ - 指向给定内存地址的指针-C++

javascript - 如何在单独的行上打印数组的每个元素?

java - 为什么会抛出空点异常?

c - 我如何将其变成递减循环?

loops - 标签 - break vs continue vs goto

C:即使条件仍然满足,循环也会弹出

c++ - Reinterpret_cast和指针删除

c++ - 在 C++ 中明智地初始化 char 数组?