【问题标题】:rand() duplicates number in looprand() 在循环中重复数字
【发布时间】:2013-08-15 06:42:53
【问题描述】:

我做了一个简单的书籍制作程序,我一直在尝试在 MAIN 函数中使用循环,在 generateNumbers() 函数中使用 rand() 将随机数分配给变量“genNum”,然后传递 'genNum ' 将值传递给 MAIN 中的三个局部变量,然后传递给我的 BOOKIE 类中的成员函数。函数循环的前两次生成随机数就好了,但第三次循环生成的数字与第二次循环生成的数字相同。我浏览了有关 rand() 的所有线程,但没有一个回答我的问题。代码如下:

这是主函数

int main()
{
    bool genNumber = false;

    int genCount = 0;
    double genNum;
    double genNum1; double genNum2; double genNum3;
    Bookie bookKeeper;
    srand(time(0));
    bookKeeper.welcomeMessage();

    clientEntry();
    bookKeeper.clientList(firstClient, secondClient, thirdClient);
    while(genNumber == false) {
    generateNumbers(genNum);//This is where the numbers are generated
    genCount++;
    if(genCount == 1) {
        genNum1 = genNum;
    }
    if(genCount == 2) {
        genNum2 = genNum;
    }
    if(genCount == 3) {
        genNum3 = genNum;
        bookKeeper.clientStatus(genNum1, genNum2, genNum3);
        genNumber = true;
      }
   }

  return 0;
}

这是生成随机数的函数:

void generateNumbers(double & number) {
number = 1 + rand() % 500;
}

这是接收随机生成值的成员函数:

void Bookie::clientStatus(double num1, double num2, double num3) {
clientAOwes = num1; clientBOwes = num2; clientCOwes = num3;
string answer;

    enum Status{PAID, LATE};
Status clientAStat;
Status clientBStat;
Status clientCStat;

bool cStatus = false;
while(cStatus == false){
    cout<<clientA <<" owes " <<clientAOwes <<".\n"
        <<"Has this client paid, (Y)es or (N)o?\n"
        <<"::";
    getline(cin, answer);
    if(answer == "Y") {
        clientAStat = PAID;
        Astat = "PAID";
    }
    if(answer == "N") {
        clientAStat = LATE;
        Astat = "LATE";
    }

    //Client 2
    cout<<clientB <<" owes " <<clientBOwes <<".\n"
        <<"Has this client paid, (Y)es or (N)o?\n"
        <<"::";
    getline(cin, answer);
    if(answer == "Y") {
        clientBStat = PAID;
        Bstat = "PAID";
    }
    if(answer == "N") {
        clientBStat = LATE;
        Bstat = "LATE";
    }

    //Client 3
    cout<<clientC <<" owes " <<clientBOwes <<".\n"
        <<"Has this client paid, (Y)es or (N)o?\n"
        <<"::";
    getline(cin, answer);
    if(answer == "Y") {
        clientCStat = PAID;
        Cstat = "PAID";
    }
    if(answer == "N") {
        clientCStat = LATE;
        Cstat = "LATE";
    }
    cStatus = true;
}

cout<<fixed <<setprecision(2);
cout<<setw(4) <<"STATUS" <<setw(21) <<"CLIENT" <<'\n' <<endl;
cout<<setw(4) <<Astat <<setw(21) <<clientA <<'\n' <<endl;
cout<<setw(4) <<Bstat <<setw(21) <<clientB <<'\n' <<endl;
cout<<setw(4) <<Cstat <<setw(21) <<clientC <<'\n' <<endl;
cout<<'\n' <<endl;
}

【问题讨论】:

  • 找不到 genCount 回到 0 的位置.....?
  • 尝试在 clientStatus 函数的开头打印您收到的值。你得到了什么?

标签: c++ random srand


【解决方案1】:

您的代码运行良好,但我推荐 std 的新随机生成器!

改变

//Client 2
    cout<<clientB <<" owes " <<clientBOwes <<".\n"

//Client 3
    cout<<clientC <<" owes " <<clientBOwes <<".\n"

//Client 2
    cout<<clientB <<" owes " <<clientBOwes <<".\n"

//Client 3
    cout<<clientC <<" owes " <<clientCOwes <<".\n"

【讨论】:

  • 我不敢相信这是一种类型。很抱歉浪费了大家的时间。但我真的很感谢这里给出的所有建议,这些都是非常好的建议,无疑会帮助我朝着积极的方向前进。
  • @ExpletiveDeleted 没关系,人们会犯错误。
【解决方案2】:

不是解决您当前问题的方法(请参阅@TheOtherGuy 对实际错误修复的回答),但您的代码过于复杂 - 您可以在不使用循环的情况下进行初始化,例如改变:

while(genNumber == false) {
    generateNumbers(genNum);//This is where the numbers are generated
    genCount++;
    if(genCount == 1) {
        genNum1 = genNum;
    }
    if(genCount == 2) {
        genNum2 = genNum;
    }
    if(genCount == 3) {
        genNum3 = genNum;
        bookKeeper.clientStatus(genNum1, genNum2, genNum3);
        genNumber = true;
    }
}

到:

generateNumbers(genNum1);
generateNumbers(genNum2);
generateNumbers(genNum3);
bookKeeper.clientStatus(genNum1, genNum2, genNum3);

并去掉变量genNumgenNumbergenCount

【讨论】:

  • @TheOtherGuy:很好 - 我完全错过了 - 答案已更新。
  • 感谢您的建议,我编码时间不长,感谢所有诚实的输入,从现在开始我会尽量不要让事情变得太复杂
  • @ExpletiveDeleted:“让一切尽可能简单,但不是更简单。” ——阿尔伯特·爱因斯坦
【解决方案3】:

复制代码,复制结果。尝试使用结构数组(或 c++ 向量)重新排列代码,并避免过度使用复制和粘贴。这将防止您犯愚蠢的错误,并提高您的编码技能。

【讨论】:

  • 谢谢,我会试一试。我只编码了几个星期,所以我知道这将是一个新手错误。但我很感激你的建议,并会试一试!!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-01-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-30
  • 1970-01-01
相关资源
最近更新 更多