C++抛硬币模拟器不起作用

C++ coin toss simulator not working

本文关键字:不起作用 模拟器 硬币 C++      更新时间:2023-10-16

我应该用 c++ 创建一个抛硬币模拟。我有这个代码;但是,我对所有 20 次投掷都获得相同的输出,这意味着我要么在所有 20 次投掷中得到正面,要么在所有 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;
}

您的toss函数会不断重新设定 PRNG 种子。不要。
在程序开始时呼叫srand一次

  • srand() — 为什么只调用一次?

你每次投掷都会播种随机数生成器,这不是要走的路。大多数情况下,每个程序只应播种一次 PRNG。在您的情况下,您会得到相同的种子,因为您在很短的时间内多次播种,因此每次投掷后您都会得到相同的结果,因为 PRNG 开始重复使用相同的种子。只需删除线条

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

从您的toss函数中将它们作为main的第一行。事实上,你可以完全摆脱seed变量,只写

srand(time(0));

int main(){

如果您有权访问 C++11,则应使用 <random> 中的新功能和 PRNG,而不是旧的Crand()/srand()组合。例如,请参阅 http://en.cppreference.com/w/cpp/numeric/random 以获取一些介绍。

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