Random int仍然会产生低于或高于范围的数字?

时间:2018-01-27 03:54:56

标签: c++

我的程序应该如何工作,首先,程序会为int secretNumber生成一个数字(永远不会改变),然后开始为int guess生成随机数。该计划继续生成int guess的数字直到int guess的目标与int secretNumber具有相同的价值。但是,我试图将其设计为如果int guess生成的数字小于或大于int secretNumber的数字,则范围会变小。

换句话说,如果int secretNumber等于45int guess被赋予随机生成的10个数,那么10之前的任何内容都将永远不会被选中,10将成为新的Low。如果secretNumber45int guess的号码为50,则50之后的任何内容都将永远不会被选中。而且,反过来,范围将变得越来越小,直到它变得只有几个可能的选择可供选择,或者直到它变得如此,以至于分配给secretNumber的数字是唯一可能的号码还剩下。

我尝试通过更改HighLow以及计算机将进行的每次猜测来建立此功能。换句话说,如果数字太高,那么新上限将是先前猜测的,但减去1,如果数字太低,则guess将是{ {1}}但添加了guess。代码最终会找到1int guess之间的匹配,但由于某种原因,每个循环都有可能生成一个高于设置上限或设置的最低可能数的数字。

所以我们假设计算机要为第一轮产生int secretNumber,但这个数字可能低于赢得比赛所需的数量。新的最低可能数字为30,因此,任何31下的数字都无法选择。但是,在下一轮中,最终会选择31

这是我在过去几个小时里遇到的一个问题,我只是迷失在我实际做错的事情上。我认为我的方法应该很容易给我我想要的结果,但这种情况正在发生,我只是不理解它背后的原因。如果有人在这里可以解释我的错误,我会非常感激。

27

4 个答案:

答案 0 :(得分:2)

您正在重新声明HighLow,而不是分配给原始版本。

答案 1 :(得分:0)

假设猜是20,如果guess < secretnumber,您将low增加到20,但不要更改high
因此,下一个随机数将为rand() % 64 + 20,最高可达63 + 20。

解决这个问题的一种方法是在你增加低的时候减少高。

答案 2 :(得分:0)

正如EJP所提到的,你正在重新宣布高低。此外,您应该使用小写字母表示变量。通常,您应该在执行期间仅使用变量类型一次,通常在程序的开头,首先声明它们。 我做了这些更改,测试了它们,现在它按预期工作:

int main()
{
    srand(static_cast<unsigned int>(time(0)));
    int secretNumber = rand() % 64 + 1;
    int tries = 0;
    int high = 64;
    int low = 1;
    int guess;// = rand() % High + Low;
    cout << "\tWelcome to Guess My Number\n\n";

    do {
        guess = rand() % high + low;
        ++tries;
        if (guess > secretNumber) {
            cout << "Too high!\n\n";
            cout << "\n"<<guess;
            high = guess - 1;
        }
        else if (guess < secretNumber) {
            cout << "Too low!\n\n";
            cout <<"\n"<< guess;
            low = guess + 1;
        }
        else
        {
            cout << "\nThat's it!You got it in" << tries << "guesses!\n";
            system("pause");
            return 0;

        }
    } while (guess != secretNumber);
    system("pause");
    return 0;
}

答案 3 :(得分:-1)

首先看看@ EJP的答案,然后从while循环中的intHigh前面移除Low。你正在重新宣布它们,这是你的第一个问题......

  

如果int secretNumber等于45且int guess被赋予随机生成的数字10,那么10之前的任何内容都将永远不会被选中。

不。不是您目前计算int guess的方式,而是赢了。让我们仔细看看。

你有什么

int guess = rand() % High + Low;

对于循环的第一次迭代,这将非常有用。您的高值仍为64,您的低值仍为1.您的第一个猜测将在该范围内。现在,当使用示例Low变为11时,循环中第二次发生了什么?现在你有guess = rand() % 64 + 11;。因此,猜测的新可能值可以是11到75之间的任何值。超出secretNumber(1-64)可能范围的哎呀!

您需要什么

您希望guess在每次迭代时都在HighLow值的可能范围内。基本上你需要在每次猜测后缩小可能的答案集。这可以通过使用以下代码行替换guess的当前表达式来完成。

int guess = rand() % (High - Low) + Low;

现在guess将为您提供最近计算的高值和低值之间的随机数。

如何运作

继续您的示例,您的下一个猜测现在将被限制在可能的范围内:guess = rand() % (64 - 11) + 11;使用此项,rand() % (64 - 11)的初始计算必须是0到53之间的值。这不是您想要的,但当您将新的下限11添加回来时,您的guess现在将在新确定的可能有效范围11到64之内。我希望这个答案和解释有助于你。