随机生成的概率游戏,循环和消除

时间:2013-02-21 04:50:59

标签: c++ loops random probability

这是我的任务:


在Puzzlevania的土地上,Aaron,Bob和Charlie对其中一个人提出了争论 是有史以来最伟大的解谜者。为了一劳永逸地结束辩论,他们同意了 在决斗中死亡。亚伦是一个可怜的射门,并且只有几率击中他的目标 1/3。鲍勃有点好,并以1/2的概率击中他的目标。查理是一个前 pert射手,从未错过。击中意味着杀戮,并且击中的人掉出决斗。 为了弥补他们射击技巧的不公平性,三人决定他们 将轮流开始,从Aaron开始,接着是Bob,然后是Charlie。这个循环 会重复,直到有一个人站着。那个男人会被所有人铭记 时间是有史以来最伟大的难题解决者。

一个明显而合理的策略是让每个人仍然以最准确的射手射击 活着,理由是这个射手是最致命的并且有最好的击球机会。 编写程序以使用此策略模拟决斗。你的程序应该随机使用 数字和问题中给出的概率,以确定射手是否击中了他 目标。您可能希望创建多个子例程和函数来完成 问题

提示 让我们说Aaron击中目标的几率是1/3。您可以通过模拟此概率 生成1到99之间的随机变量R.什么是概率 R小于33?这是1/3。你看到这是领先的吗?如果R 33,那么我们可以 模拟亚伦击中目标。如果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行添加了错误#,因为我在编译程序时看到了我的错误。

如果我得到了错误1,2,3和6的cout行,程序会运行,我不会得到一个带有它的命名获胜者的cout。此外,有了这些数字,我似乎有时得到一个双重结果(即带有该错误的结果和另一个来自程序的不同部分的结果)导致我认为我的循环存在问题。

我选择使用循环而不是递归函数,因为它超出了赋值范围。

我很感激我的语法和形式的任何评论,因为我真的很难过。

1 个答案:

答案 0 :(得分:1)

第一点 - a= rand() % 100;不给出1..99(含),它给出0..99(含)。您可以使用a = (rand() % 99) + 1代替。这仍然不是一个完全统一的分布,因为rand给出的随机数范围可能不能被99整除。可能的修正包括......

  1. 使用C ++ 11随机数库,如WhozCraig建议的那样。

  2. 在循环中生成随机数。例如,如果rand()给出值>= 9900,请将其丢弃并重试。将此循环放在一个函数中,这样您就不必每次都担心它。

  3. 不要担心 - 对于这样的事情,如果你应该关心这个问题,你可能已经被警告了。

  4. 下一点是代码,如...

    if (b<=50)  //if bob kills aaron
    {
        aaron=0;
        cout<<"error1"<<endl;
    }
    else if (b>50)
    

    这里的if (b>50)完全是冗余的,至少对编译器来说是这样。为了清楚起见,你可以将它包括在内,因为你已经有了相当长的代码块,并且在这里有一些深层嵌套,但是我会把它作为评论,让else完成它的工作。

    可能是你真正的问题,但是......

    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++;
            }
        }
    }
    

    如果Aaron射击Bob,b未被修改,那么循环再次重复。 Aaron可以一次又一次地射击Bob,最后他错过了,而且即使他已经死了,Bob终于转了过来。你需要改变你的循环条件 - 可能在其他情况下,虽然我没有检查。我可能会使用done标志。

    接下来,您并不需要ab的单独变量(我认为您甚至不使用c) - 只需使用单个变量{ {1}} r或类似内容。

    最后,我使用的结构将是......

    random

    这里的要点是,如果你试图过多地记住控制流程中谁活着以及谁死了,那么代码就会变得错综复杂。再次检查下一次迭代似乎是不必要的工作,但这些检查是微不足道的,即使它们不是那种过早的优化。您应该更喜欢更简单的代码。

    在这种情况下,您还可以查看这三个while num_alive > 1 if aaron_alive if charlie_alive aaron tries to shoot charlie else aaron tries to shoot bob if bob_alive if charlie_alive bob tries to shoot charlie else bob tries to shoot aaron if charlie_alive if bob_alive charlie tries to shoot bob else charlie tries to shoot aaron 块的相似程度,以及它们如何被分解为函数。