我是C ++的新手。我基本上是自学。我遇到了一个我正在练习的Hangman游戏项目。我的问题是随机字生成。
我知道例如int n=rand()% 10
意味着生成0到10范围内的随机数。
现在游戏中有一个包含10个单词的数组。我感到困惑的是,如果从0到10的数字是随机生成的,那么这将是从11个随机数中选择的。但是,该数组只有10个元素(0-9)。
当随机发生器选择10时会发生什么?元素10不存在于数组中,对吧?
那么这段代码应该不是int n=rand()% 9
吗?
此外,在游戏中选择所有单词之前,是否可以重复相同的单词?那显然不是理想的。如果可以的话,我该如何防止这种情况?
答案 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