0

我正在尝试编写一个程序,该程序将从我的数组中为刽子手选择一个随机单词,我有以下代码。如果没有int n = rand() % 10; words = word1[n];代码列出字典中的所有单词,代码就会崩溃,还有其他方法可以实现吗?我希望代码选择一个单词,MAX_WORDS= 106184。

4

3 回答 3

4

while (wordIndex < MAX_WORDS)如果我把你的代码写对了,你就会退出循环wordIndex == MAX_WORDS

而你return myWords[wordIndex];的下标限制为 1。

于 2013-10-01T15:00:14.123 回答
1

word1是一个词。word1[n]是第 n+1 个字母(C++ 从 0 开始计数,word1[0]是第一个字母)。由于n是随机的,因此您必须确保每个单词至少有 10 个字母。是这样吗?选择第十个字母"cat"很可能会崩溃。

此外,您永远不会选择word1. 这可能不是故意的。事实上,你甚至试图选择随机字母吗?

于 2013-10-01T22:50:02.567 回答
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++ 编译器,您可以使用<random>TR1 中的模块,即http://en.cppreference.com/w/cpp/numeric/random。在较旧的编译器上,您还可以使用 boost 的 random 模块。

否则,如果您使用旧的编译器并且不能使用 TR1 随机库或 boost 随机库,这是生成大随机数的简单方法:

// 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);
}
于 2013-10-01T15:39:23.587 回答