如何列出数组中的随机单词

时间:2013-10-01 14:44:14

标签: c++

我正在尝试编写一个程序,它将从我的数组中为hangman选择一个随机单词,我有以下代码。没有int n = rand() % 10; words = word1[n];代码列表字典中的所有单词,以及它崩溃的代码,还有另一种方法可以实现吗?我希望代码选择一个单词MAX_WORDS = 106184。

3 个答案:

答案 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个字母。这可能不是故意的。事实上,你甚至试图挑选随机字母吗?