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

Igo*_*syn 2 c++ arrays random loops

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

我有一个包含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;
 }
Run Code Online (Sandbox Code Playgroud)

所以,我尝试了所有可能的选择.它要么将男性放在所有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]);
Run Code Online (Sandbox Code Playgroud)

Pio*_*ski 5

这个:

srand( time( NULL ) );
j = rand() % 50;
Run Code Online (Sandbox Code Playgroud)

是问题.time(NULL)具有1秒的分辨率.这使你的随机生成器几乎总是相同的值,因为外循环比一秒快得多.

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

另外:你的任命j不起作用.您修改副本的说法,并再也没有回到这个副本.