2013-10-01 2 views
0

Я пытаюсь написать программу, которая будет выбирать случайное слово из моего массива для палача, у меня есть следующий код. Без int n = rand() % 10; words = word1[n]; список кодов всех слов в словаре, с кодом crashses, есть ли другой способ достичь этого? Я хочу код, чтобы выбрать одно слово, MAX_WORDS = 106184.Как перечислить случайное слово из массива

+0

что говорится в отчете о сбое? – ladislas

+0

exeception: строковый индекс вне диапазона – james

+3

@james: Я не совсем понимаю, что вы пытаетесь сделать здесь. Вы называете свою функцию ListAllWords, но вы говорите, что хотите выбрать случайное слово из массива, тогда ваша функция делает что-то совершенно иное, чем любое. Что вы на самом деле пытаетесь сделать? –

ответ

4

Если я получить код право, вы выходите из цикла while (wordIndex < MAX_WORDS) когда wordIndex == MAX_WORDS

и вы return myWords[wordIndex]; который выключен предел индекса к 1.

+0

Да, правильно, 'MAX_WORDS', сколько слов есть в словаре. – james

+0

@james: как это может быть «правильно»? Вы понимаете, что это * является источником вашего исключения? Вы, вероятно, хотите вернуть случайное слово из всего списка (не считайте запутанное имя функции), поэтому возвращайте myWords [rand()% MAX_WORDS] -> GetWord(); ' – usr2564301

+0

@james Почему вы удалили код из ур вопрос? И вы понимаете, что 'myWords [MAX_WORDS]' будет вне допустимого индекса массива, не так ли? – theAlias

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.

В противном случае, если вы застряли со старым компилятором, и вы не можете использовать ни случайную библиотеку 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); 
} 
1

word1 является одно слово. word1[n] - это n + 1'th письмо (C++ начинается с 0, word1[0] - это первая буква). Поскольку n является случайным, вы должны убедиться, что каждое слово имеет не менее 10 букв. Это так? Выбор десятой буквы "cat" может привести к сбою.

Кроме того, вы никогда не выбираете 11-ю букву word1. Это, вероятно, не преднамеренно. На самом деле, вы даже пытаетесь выбрать случайные буквы?

Смежные вопросы