我遇到了一个我最初认为很容易解决的问题!
我有一个包含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个座位。 : - (
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]);
答案 0 :(得分:5)
此:
srand( time( NULL ) );
j = rand() % 50;
是问题所在。 time(NULL)具有1秒的分辨率。这会使你的随机生成器几乎总是相同的值,因为外环比一秒快得多。
解决方案:在程序开头只初始化一次随机生成器。
此外:您对j
的任命无效。您修改参数的副本,并且永远不会返回此副本。
答案 1 :(得分:4)
您的random()
函数不会返回任何内容。你可能意味着通过引用传递j。
答案 2 :(得分:1)
目前,您的random()
函数不会返回任何内容。
试试这个: -
void random(int &j)
修改: - 强>
尝试使用std::random_shuffle在男性/女性填写所需的身份后随机化职位
答案 3 :(得分:1)
按参考
发送参数void random(int &j);
void random(int &j)
{
j = rand() % 50;
}
致电
主页上的srand(time(NULL));
。
祝你好运。答案 4 :(得分:1)
所以,其他人已经指出了随机函数签名中的小错误。
虽然可能有一种更简单的方法。首先,用正确比例的乘客填充阵列。只需要使用几个for循环就可以做到这一点,或者如果你愿意的话,可以选择更好的东西。
然后使用std :: random_shuffle。它会给你一个very reliable shuffle。 get it wrong有很多种方法,所以使用经过良好测试的算法是很好的.. :)