例如,我正在制作猜谜游戏。如果计算机猜测太低,我想将其发送到此功能
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);
}
}
答案 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";
}
希望这有帮助。