Похоже, что ваша непосредственная проблема была решена, но я думаю, что стоит упомянуть еще один момент. Использование остатка для фиксации выходов от rand до заданного диапазона обычно приводит к смещению результатов. Конкретно, если диапазон генератора (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;
}
Как asveikau отметил в своем посте, вы вообще хотите использовать старшие биты от типичного линейного конгруэнтного генератора. Нижние биты обычно более предсказуемы. Деля, вместо того, чтобы брать остаток, сохраняет верхние биты. Хотя у этого есть цикл while, он часто выполняется только один раз и редко более чем в два раза, поэтому его влияние на производительность довольно минимальное.
Означает ли это, зависит от того, какое использование вы создаете из числа, которое вы создаете, - если вы хотите играть в кости или карты для игры, которые ваши дети будут играть пару раз, используя остаток, как правило, не повредит вещь. Если вы пытаетесь сделать какое-то моделирование в Монте-Карло (например), вы, вероятно, захотите быть немного более осторожным, хотя ...
Можете ли вы опубликовать часть кода, который вы используете? – fbrereto
Не rand() дает вам число от 0 до 1, поэтому вам нужно умножить его перед применением модуля? – slugster
@slugster - rand() последовательно дает мне число выше 10000000. –