我正在尝试用C ++制作一个基于文本的战斗机,这是我做过的第一件事。到目前为止,我有这个:
//Text Based Fighter
#include <iostream>
#include <stdlib.h> //srand, rand
#include <string>
using namespace std;
int main() {
//Player
int playerHealth = 100;
int attack1;
int attack2;
int attack3;
string attack;
int npc1;
int npc2;
cout << "Do you want to attack " << rand()[npc1,npc2];
//varname = rand() % 10 + 1;
return 0;
}
我想要它做的是在npc1和npc2之间随机选择,谢谢。
关于我如何编写代码的任何评论都将不胜感激,我几天前才开始感谢,如果您需要更多详细信息,请随时提出,谢谢。
答案 0 :(得分:1)
您可以使用任意数量的变量数组来选择:
int attack[n]; //For some int-constant n
attack[rand() % n]; //choose a random attack-variable, use it
答案 1 :(得分:1)
对于2个选项,您可以使用三元表达式从2中取出余数:
int choice = rand() % 2 == 0 ? npc1 : npc2;
如果您有两个以上的选择,或者即使您没有,也可以使用这些选项创建一个数组并将其编入索引。
int npc_choices[2];
int choice = npc_choices[rand() % 2];
如果选项的数量不是2的幂,则可能会使用模%
运算符在选择中引入非常小的偏差。如果你没有处理具有统计意义或有大量选择的任何事情,我不会担心它。
答案 2 :(得分:0)
如果您在C ++ 11中只有两个选择,则可以使用std::bernoulli_distribution,这是一个过于简化的示例:
#include <iostream>
#include <random>
int main()
{
std::random_device rd;
std::mt19937 gen(rd());
// give "true"1/2 of the time
// give "false" 1/2 of the time
std::bernoulli_distribution d(0.5);
int npcs[2] = {100, 101};
int index = d(gen) ? 0 : 1;
std::cout << "Do you want to attack " << npcs[index] ;
}
使用数组更灵活,因为它可以轻松扩展到两个以上的选项,然后您需要使用std::uniform_int_distribution在[0,N]
之间进行选择。
从长远来看使用rand() is not a good idea,虽然在很多简单的情况下它可能正常工作。正如Pete提到的那样,只要您了解rand()
的限制就可以使用它,而 C FAQ 就有一个很好的部分,How can I get random integers in a certain range?。
答案 3 :(得分:0)
生成伪随机数时很容易出错。例如,在某些情况下使用rand() % RANGE
会导致数字的错误分布。 (有关问题的示例,请参阅this reference。)
如果您所做的事情微不足道,这可能无关紧要。
如果你想要高质量的伪随机数,有办法解决rand()
(参见上面的参考资料),但现代C ++也提供了<random>
和uniform_int_distribution
。
以下是一个示例,模拟投掷6面骰子,改编自Boost和C++ Reference中的示例:
#include <iostream>
#include <random>
std::random_device rd;
std::mt19937 gen(rd());
int roll_die() {
std::uniform_int_distribution<> dist(1, 6);
return dist(gen);
}
int main() {
std::cout << roll_die() << std::endl;
}
可以将dist(1, 6)
的部分更改为dist(0, 1)
,以生成[0,1](含)范围内的输出,并且分布均匀。