【发布时间】:2013-02-06 08:02:00
【问题描述】:
这是我的任务:
在 Puzzlevania 的土地上,亚伦、鲍勃和查理为他们中的哪一个发生了争执 是有史以来最伟大的解谜者。为了一劳永逸地结束争论,他们同意 在生死决斗中。亚伦的射门很差,只有 1/3。 Bob 稍微好一点,以 1/2 的概率击中了他的目标。查理是前任 完美的神射手,从未错过。击中意味着杀死,被击中的人退出决斗。 为了弥补枪法上的不公平,三人决定 将轮流进行,从 Aaron 开始,然后是 Bob,然后是 Charlie。循环 会重复,直到有一个人站着。那个男人会被所有人铭记 成为有史以来最伟大的解谜者。
一个明显而合理的策略是让每个人仍然向最准确的射手射击 活着,理由是这个射手是最致命的,并且有最好的反击机会。 编写一个程序来模拟使用这种策略的决斗。你的程序应该使用随机 问题中给出的数字和概率来确定射手是否击中他的 目标。您可能需要创建多个子例程和函数来完成 问题。
提示 假设 Aaron 击中目标的几率是 1/3。您可以通过以下方式模拟此概率 生成一个介于 1 和 99 之间的随机变量 R。发生的概率是多少 R小于33?是 1/3。你知道这会导致什么吗?如果 R 33,那么我们可以 模拟 Aaron 击中目标。如果 R > 33,那么他错过了。也可以随机生成 0 到 1 之间的变量,并检查它是否小于 0.33。
这是我从头重写两次后终于能够编写的代码:
#include <iostream>
#include <cstdlib>
#include <ctime>
using namespace std;
int main ()
{
int aaron=1, bob=1,charlie=1, a=0,b=0,c=0,counter=0;
srand(time(0));
a= rand() % 100;
if (a<=33)//if aaron kills charlie
{
charlie=0;
b= rand() % 100; //bob choots at aaron
if (b<=50) //if bob kills aaron
{
aaron=0;
cout<<"error1"<<endl;
}
else if (b>50)
{
while (b>50) //if bob misses
{
a= rand() % 100; //aaron shoots at bob
if (a<=33)// if he kills bob
{
bob=0;
cout<<"error2"<<endl;
}
else //if he misses
{
b= rand() % 100;//bob shoots at aaron
if (b<=50)//if he kills him
{
aaron=0;
cout<<"error3"<<endl;
}
else //if he misses then the loop continues
{
counter++;
}
}
}
}
}
else if (a>33)//aaron misses
{
b= rand() % 100; //bob shoots at charlie
if (b<=50) //he kills charlie
{
charlie = 0;
a= rand() % 100; //aaron shoots at bob
if (a<=33)//aaron kills bob
{
bob=0;
cout<<"error4"<<endl;
}
else //if not
{
b= rand() % 100;//bob shoots at aaron
if (b<=50) // if he kills aaron
{
aaron=0;
cout<<"error5"<<endl;
}
else if (b>50)
{
while (b>50)//if not then begin loop
{
a= rand() % 100; //aaron shoots at bob
if (a<=33) //if he kills him
{
bob=0;
cout<<"error6"<<endl;
}
else
{
b= rand() % 100;; //if not bob shoots at aaron
if (b<=50)// if he kills aaron
{
aaron=0;
cout<<"error7"<<endl;
}
else
{
counter++; //if not loop around
}
}
}
}
}
}
else //he misses so charlies kills bob
{
bob=0;
a= rand() % 100; //aaron shoots at charlie
if (a<=33) //aaron kills charlie
{
charlie=0;
cout<<"error8"<<endl;
}
else // or charlie kills aaron
{
aaron=0;
cout<<"error9"<<endl;
}
}
if (charlie==0 && bob==0)
{
cout<<"Aaron wins."<<endl;
}
else if (aaron==0 && bob==0)
{
cout<<"Charlie wins."<<endl;
}
else if (charlie==0 && aaron==0)
{
cout<<"Bob wins."<<endl;
}
}
return 0;
}
我在 cout 行中添加了 error#,以便在我编译程序时查看我的错误在哪里。
如果我得到错误 1、2、3 和 6 的 cout 行,程序将继续运行,我没有得到一个带有命名获胜者的 cout。此外,对于这些数字,我似乎有时会得到双重结果(即一个错误的结果和另一个来自程序不同部分的结果)导致我假设我的循环存在问题。
我选择使用循环而不是递归函数,因为它超出了赋值范围。
如果我真的很难过,我将不胜感激任何对我的语法和形式的评论。
【问题讨论】:
-
旁注:如果您应该具有均匀分布,您可能希望选择使用均匀分布 RNG 算法。如果你可以使用 C++11,
<random>已经为你提供了这样的发行版,即std::uniform_int_distribution。设置有点奇怪,但最终值得。请注意,rand()%100不会为您提供统一分布。 -
另外,
rand () % 100给出的值是 0..99,而不是问题似乎要求的 1..99,所以即使分布均匀,<=33也会给出 34%案例。rand () % 3 == 0在这种情况下会更准确 - 避免额外的 1% 并减少但不消除使用%的错误(提示 - 随机数的范围可能不能被 3 或 100 整除,或者99 所以较低值的余数出现的频率略高)。
标签: c++ loops random probability