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