如何在C ++中生成任何一个或更多的随机数?

时间:2018-05-08 20:34:01

标签: c++

例如,我正在制作猜谜游戏。如果计算机猜测太低,我想将其发送到此功能

int player1::guessLow(int g)
{
return rand() % guess + 1;
}

所以它猜测任何数字上面的猜测。当它太高时我也想做同样的事情

int player1::guessHigh(int g)
    {
    return rand() % guess - 1;
    }

显然这不是正确的代码,但我该怎么做? <和>运营商之间的猜测不起作用。我正在尝试提出任何随机数,并帮助计算机记住所以它不断猜测低于或高于该数字。我怎么做到这一点?我可以使用算法或模板吗?

更新:

这是代码

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

2 个答案:

答案 0 :(得分:1)

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

或者按照评论中的建议使用此功能,以查找范围内的数字。

int rand_rang(int min, int max)
{
    if(min == max)
        return min;
    return min + (int)((double)rand() / ((double)RAND_MAX + 1) * (max - min));
}

这些都是伪随机数。如果您正在为彩票公司设计此游戏,那么使用更难以破解的安全随机数生成器。如果分布非常重要(物理模拟等),那么你想再次避免rand

答案 1 :(得分:1)

有许多使用标准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 );
}

(如果您只是单线程,则可以将thread_local替换为static。)

要获得仅受最小值或最大值限制的范围,请使用numeric_limits<>查找要绑定的最低/最高值:

#include <limits>

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

希望这有帮助。