C ++硬币投掷模拟器无法正常工作

时间:2014-11-30 22:22:10

标签: c++ c

我应该用c ++创建一个投币硬币。我有这个代码;然而,我得到了所有20次投掷的相同输出,这意味着我要么得到所有二十次投掷的头,要么我得到所有二十次投掷的尾巴。我从来没有像我应该那样得到任何变化。我觉得好像我已经完成了所有事情,除了那一部分。谁能指出我正确的方向?

代码:

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

using namespace std;

class Coin
{
public:
Coin()
{
    toss();
}

void toss()
{
    unsigned seed = time(0);
    srand(seed);

    int num = (rand()%(2));

    if (num == 0)
    {
        sideUp = ("Heads");
    }
    else
    {
        sideUp = ("Tails");
    }
}

string getSideUp()
{
    return sideUp;
}
private:
string sideUp;
};

int main()
{
int totHeads = 0, totTails = 0;

Coin flip;

cout<<"Flip #1: "<<flip.getSideUp()<<endl;

if (flip.getSideUp() == ("Heads"))
{
    totHeads += 1;
}
else
{
    totTails += 1;
}


for (int x = 2; x <= 20; x++)
{
    flip.toss();
    cout<<"Flip #"<<x<<": "<<flip.getSideUp()<<endl;

    if (flip.getSideUp() == ("Heads"))
{
    totHeads += 1;
}
else
{
    totTails += 1;
}
}

cout<<"The total amount of heads were: "<<totHeads<<endl;
cout<<"The total amount of tails were: "<<totTails<<endl;

return 0;
}

3 个答案:

答案 0 :(得分:2)

您的toss功能会重新播种PRNG。不要。
在您的计划开始时拨打srand 一次

答案 1 :(得分:2)

你正在为每次折腾播种随机数生成器,这不是可行的方法。大多数情况下,每个程序只应为PRNG播种一次。在你的情况下,你得到相同的种子,因为你在非常短的时间内播种多次,因此你在每次投掷后获得相同的结果,因为PRNG开始重复使用相同的种子。只需删除行

unsigned seed = time(0);
srand(seed);

来自toss函数,并将它们作为main中的第一行。实际上,你可以完全摆脱seed变量,只需编写

srand(time(0));
int main(){

之后

如果您有权访问C ++ 11,则应使用<random>中的新功能和PRNG,而不是旧的C - 样式rand()/srand()组合。参见例如http://en.cppreference.com/w/cpp/numeric/random进行了一些介绍。

答案 2 :(得分:1)

问题是您在toss()功能开始时播种随机生成器。程序运行得如此之快,以至于time(0)在每次调用时都是相同的,因此随机数生成器将在每次调用时重置为相同的起始点。因此,您每次都会获得相同的随机数。在重复开始调用srand()函数之前,您应该只调用toss()一次。