如何使用Rand()随机选择一个变量

时间:2013-12-17 23:04:38

标签: c++ random

我正在尝试用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之间随机选择,谢谢。

关于我如何编写代码的任何评论都将不胜感激,我几天前才开始感谢,如果您需要更多详细信息,请随时提出,谢谢。

4 个答案:

答案 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面骰子,改编自BoostC++ 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](含)范围内的输出,并且分布均匀。