C++ 如何在C+中生成低于或高于某个数字的任意随机数+;?

C++ 如何在C+中生成低于或高于某个数字的任意随机数+;?,c++,C++,例如,我在做一个猜谜游戏。如果计算机猜测太低,我想将其发送到此函数 int player1::guessLow(int g) { return rand() % guess + 1; } 这样它就能猜出比刚才猜到的任何数字都高的数字。我也希望当它太高的时候也这样做 int player1::guessHigh(int g) { return rand() % guess - 1; } 很明显,这不是正确的代码,但是我该怎么做呢?运算符在guess前面不工作。我试图找出

例如,我在做一个猜谜游戏。如果计算机猜测太低,我想将其发送到此函数

int player1::guessLow(int g)
{
return rand() % guess + 1;
}
这样它就能猜出比刚才猜到的任何数字都高的数字。我也希望当它太高的时候也这样做

int player1::guessHigh(int g)
    {
    return rand() % guess - 1;
    }
很明显,这不是正确的代码,但是我该怎么做呢?<和>运算符在guess前面不工作。我试图找出任意一个随机数,帮助计算机记住,这样它就可以不断地猜测低于或高于那个数的数字。我将如何做到这一点?是否有我可以使用的算法或模板

更新:

这是密码

   bool checkForWin(int guess, int answer) 
{ 
    cout << "You guessed " << guess << ". ";
    if (answer == guess) 
    { 
        cout << "You're right! You win!" << endl; 
        return true; 
    } 
    else if (answer < guess) 
        cout << "Your guess is too high." << endl; 
    else 
        cout << "Your guess is too low." << endl; 
    return false; 
} 

void play(Player &player1, Player &player2) 
{ 
    int answer = 0, guess = 0; 
    answer = rand() % 100;
    bool win = false; 

    while (!win) 
    { 
    cout << "Player 1's turn to guess." << endl; 
    guess = player1.getGuess(); 
    win = checkForWin(guess, answer); 
    if (win) return; 

    cout << "Player 2's turn to guess." << endl; 
    guess = player2.getGuess(); 
    win = checkForWin(guess, answer); 
    }
}
bool checkForWin(整数猜测,整数回答)
{ 
Cuth

<代码> RAND():代码>是C++的一部分(至少现在),对于简单的猜谜游戏来说是很好的。 在某些情况下,

srand
可能不合适,例如,出于测试目的,我可能需要重复的行为和可预测性

对于这个问题,您可能希望使用
srand
,否则猜游戏会变得无聊

在许多应用程序(如加密)中,您应该完全避免使用
rand

但这里的问题更为基本。你不需要记录你猜到的所有数字。你只需要记录最小和最大范围。例如:

#include <iostream>
#include <ctime>
#include <cstdlib>

using std::cout;

int main()
{
    srand((unsigned int)time(NULL));
    int guess = rand();
    int min = 0;
    int max = RAND_MAX;
    while(true)
    {
        int n = min + rand() % (max - min);
        //(n goes up to max, not including max)

        if(n < guess)
        {
            min = n + 1;
            cout << n << " too low\n";
        }
        else if (n > guess)
        {
            max = n;
            cout << n << " too high\n";
        }

        if(min == max)
            n = min;

        if(n == guess)
        {
            cout << n << " success\n";
            break;
        }
    }
    return 0;
}

这些都是伪随机数。如果你是为彩票公司设计这个游戏,那么使用一个更难破解的安全随机数生成器。如果分布非常重要(物理模拟等)然后,你要避免<代码> RAND

> P>有很多例子,在给定的范围内使用标准的C++设备生成一个随机数。这里有一个小线程安全函数,可以在一个范围内获得一个数字:

#include <chrono>
#include <iostream>
#include <random>

long random( long min, long max )
{
  // Create and initialize our PRNG
  thread_local auto seed = std::chrono::system_clock::now().time_since_epoch().count();
  thread_local std::ranlux48 prng( seed );
  return std::uniform_int_distribution <long> ( min, max )( prng );
}

希望这能有所帮助。

步骤1:.是的,我当然知道随机数生成,但我如何在某个数字之上或之下生成随机数?如果你“知道随机数生成”,那么你就会知道有一些函数正是这样做的。
rand()提示:它们是专门指导你学习C++习语来生成随机数的,这给你的问题提供了一个非常优雅的解决方案。你使用的不是这个问题的C++习语。也可以看到:C++社区在哪里需要一个非常需要的干预来消除<代码> SRand(时间)。(空)
。这正是我一直反对使用C的标准随机数工具的原因:因为偏差错误总是作为有效答案给出的。这给了我一个无限循环的相同数字被猜测。它在我的计算机上运行良好。我如何编辑它以使没有任何重复的数字?我得到了很多重复猜测几乎无限期地继续你的
checkForWin
总是返回false。你的代码中一定有其他错误。我用头文件编写了MCVE,它实际上编译并工作。
#include <chrono>
#include <iostream>
#include <random>

long random( long min, long max )
{
  // Create and initialize our PRNG
  thread_local auto seed = std::chrono::system_clock::now().time_since_epoch().count();
  thread_local std::ranlux48 prng( seed );
  return std::uniform_int_distribution <long> ( min, max )( prng );
}
#include <limits>

int main()
{
  std::cout << "Maximum value of 12: " << random( std::numeric_limits <long> ::min(), 12 ) << "\n";
}