ハングマンの配列からランダムな単語を選択するプログラムを作成しようとしています。次のコードがあります。int n = rand() % 10; words = word1[n];
コードがクラッシュするコードを使用して、辞書内のすべての単語をリストしない場合、これを達成する別の方法はありますか? コードで単一の単語を選択するようにしたいMAX_WORDS
= 106184.
3 に答える
私があなたのコードを正しく理解すれば、ループから抜け出すことができますwhile (wordIndex < MAX_WORDS)
。wordIndex == MAX_WORDS
return myWords[wordIndex];
そして、添え字の制限を 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 は 106184 未満である 2^16 よりも大きいことが保証されていることです。この問題を回避するには、比較的最近の C++ コンパイラでは<random>
、TR1 のモジュール、つまりhttp://en.cppreference.com/w/cpp/numeric/randomを使用できます。古いコンパイラでは、boost の random モジュールも使用できます。
それ以外の場合、古いコンパイラに行き詰まっていて、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);
}
word1
は一言です。word1[n]
は n+1 番目の文字です (C++ は 0 からカウントを開始しword1[0]
、最初の文字です)。はランダムであるためn
、すべての単語が少なくとも 10 文字であることを確認する必要があります。そうですか?の 10 番目の文字を選択"cat"
するとクラッシュする可能性があります。
また、 の 11 番目の文字を選択することはありませんword1
。それはおそらく意図的ではありません。実際、ランダムな文字を選択しようとしていますか?