应用于单词数组的随机数范围

时间:2015-01-24 12:47:51

标签: c++

我是C ++的新手。我基本上是自学。我遇到了一个我正在练习的Hangman游戏项目。我的问题是随机字生成。

我知道例如int n=rand()% 10意味着生成0到10范围内的随机数。

现在游戏中有一个包含10个单词的数组。我感到困惑的是,如果从0到10的数字是随机生成的,那么这将是从11个随机数中选择的。但是,该数组只有10个元素(0-9)。

当随机发生器选择10时会发生什么?元素10不存在于数组中,对吧? 那么这段代码应该不是int n=rand()% 9吗?

此外,在游戏中选择所有单词之前,是否可以重复相同的单词?那显然不是理想的。如果可以的话,我该如何防止这种情况?

2 个答案:

答案 0 :(得分:5)

  

我知道例如int n = rand()%10表示生成随机数   从0到10。

不完全是。然后生成的范围是[0,9]。 旁注:在C ++ 11中,您应该使用更好的随机数生成器:std::uniform_int_distribution

#include <random>
#include <iostream>

int main()
{
    std::random_device rd;
    std::mt19937 gen( rd());

    // here (0,9) means endpoints included (this is a call to constructor)
    std::uniform_int_distribution<> dis(0, 9);

    std::cout << dis(gen) << std::endl; // std::endl forces std::cout to
                                        // flush it's content, you may use '\n'
                                        // instead to buffer content  
    return 0;
}

如果您尝试使用超出范围的索引下标数组,那么这是一个名为Undefined Behavior的灾难:

Undefined behavior and sequence points

What are all the common undefined behaviours that a C++ programmer should know about?

答案 1 :(得分:0)

你误解了C / C ++中的范围和模数:范围包括第一个元素,但(通常)不是最后一个元素。因此,范围[0,10]是0,1,2,3,...,9。模数是数学的,表达式x%10将结果钳位到范围[0,10],即0, 1,2,3,...,9