我正在尝试编写一个程序,它将从我的数组中为hangman选择一个随机单词,我有以下代码。没有int n = rand() % 10; words = word1[n];
代码列表字典中的所有单词,以及它崩溃的代码,还有另一种方法可以实现吗?我希望代码选择一个单词MAX_WORDS
= 106184。
答案 0 :(得分:4)
如果我的代码正确,那么当while (wordIndex < MAX_WORDS)
wordIndex == MAX_WORDS
和你return myWords[wordIndex];
的下标限制为1.
答案 1 :(得分:1)
如果RAND_MAX > MAX_WORDS
那么您可以这样做:
Word* Dictionary::ListWord()
{
int n = rand() % MAX_WORDS;
return myWords[n];
}
这里有几个问题,请注意rand() % MAX_WORDS
的分布由于模运算符而不完全一致(较低的值稍微更可能),但只要模数通常很接近均匀相对于MAX_RAND来说很小。
第二个更重要的问题是rand()只生成小于RAND_MAX的数字,并且在某些平台RAND_MAX上,并且RAND_MAX仅保证大于2 ^ 16,小于106184.为了避免这个问题,如果你有一个相对现代的C ++编译器,你可以使用TR1的<random>
模块,即http://en.cppreference.com/w/cpp/numeric/random。在较旧的编译器上,您还可以使用boost的随机模块。
否则,如果您遇到旧编译器并且无法同时使用TR1随机库或增强随机库,这是生成大型随机数的简单方法:
// taken from: http://stackoverflow.com/a/7920941/309412
// this generates a random 64-bit integer
uint64_t rand64() {
return (((uint64_t) rand() << 0) & 0x000000000000FFFFull) |
(((uint64_t) rand() << 16) & 0x00000000FFFF0000ull) |
(((uint64_t) rand() << 32) & 0x0000FFFF00000000ull) |
(((uint64_t) rand() << 48) & 0xFFFF000000000000ull);
}
答案 2 :(得分:1)
word1
是一个单词。 word1[n]
是第n + 1个字母(C ++从0开始计数,word1[0]
是第一个字母)。由于n
是随机的,因此您必须确保每个单词至少包含10个字母。是这样的吗?挑选"cat"
的第十个字母可能会崩溃。
另外,你永远不会选择word1
的第11个字母。这可能不是故意的。事实上,你甚至试图挑选随机字母吗?