我应该用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;
}
答案 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()
一次。