Похоже, что ваша непосредственная проблема решена, но я думаю, что все же стоит упомянуть еще один момент. Использование остатка для фиксации выходов из ранда в указанный диапазон обычно вызывает смещение результатов. В частности, если диапазон генератора (RAND_MAX в случае C или C ++) не кратен диапазону, к которому вы привязываетесь, некоторые выходы будут происходить чаще, чем другие. Для сравнения рассмотрим попытку равномерно разделить 11 конфет между 3 детьми (не разбивая их на части). Единственный способ, которым вы можете это сделать, - НЕ раздавать некоторые конфеты. Аналогично, для генератора случайных чисел единственный способ получить равномерное распределение в выходных данных - не использовать некоторые входные данные.
int rand_lim(int limit) {
/* return a random number between 0 and limit inclusive.
*/
int divisor = RAND_MAX/(limit+1);
int retval;
do {
retval = rand() / divisor;
} while (retval > limit);
return retval;
}
Как указал Асвейкау в своем посте, вы обычно хотите использовать верхние биты типичного линейного конгруэнтного генератора. Младшие биты обычно более предсказуемы. Деление вместо взятия остатка позволяет сохранить верхние биты. Хотя в нем есть цикл while, он часто выполняется только один раз и редко более двух раз, поэтому его влияние на производительность довольно минимально.
Стоит ли это делать, зависит от того, как вы используете числа, которые вы генерируете, - если вы хотите, чтобы в игру, в которую ваши дети играли пару раз, играли в кости или играли, остаток обычно не повредит вещь. Если вы пытаетесь выполнить какую-то симуляцию Монте-Карло (например), вы, вероятно, хотите быть немного более осторожным, хотя ...