Я просто нашел это в Интернете. Это должно работать:
DWORD random = ((min) + rand()/(RAND_MAX + 1.0) * ((max) - (min) + 1));
Решение, данное человек 3 рэнда для числа между 1 и 10 содержащих:
j = 1 + (int) (10.0 * (rand() / (RAND_MAX + 1.0)));
В Вашем случае, это было бы:
j = min + (int) ((max-min+1) * (rand() / (RAND_MAX + 1.0)));
, Конечно, это не идеальная случайность или однородность, как некоторые другие сообщения указывают, но это достаточно для большинства случаев.
По их характеру небольшая выборка случайных чисел не должна быть равномерно распределена. Они случайны, в конце концов. Я соглашаюсь, что, если генератор случайных чисел генерирует числа, которые последовательно, кажется, сгруппированы, тогда существует, вероятно, что-то не так с ним.
, Но имеют в виду, что случайность не обязательно универсальна.
Редактирование: Я добавил "небольшую выборку" для разъяснения.
Если Вы хотите, чтобы числа были равномерно распределены по диапазону, необходимо разбить диапазон во многие равные разделы, которые представляют число очков, в котором Вы нуждаетесь. Тогда получите случайное число с минутой / макс. для каждого раздела.
Как другое примечание, Вы не должны, вероятно, использовать рэнд (), поскольку это не очень хорошо при фактической генерации случайных чисел. Я не знаю, на какой платформе Вы работаете, но существует, вероятно, лучшая функция, которую можно вызвать как случайный ().
Проверьте, какой RAND_MAX находится в Вашей системе - я предполагаю, что это - только 16 битов, и Ваш диапазон является слишком большим для него.
Кроме того посмотрите это обсуждение: Генерирующие Случайные Целые числа в Желаемом Диапазоне и примечания по использованию (или не) рэнд C () функция .
Необходимо посмотреть на RAND_MAX для конкретного компилятора/среды. Я думаю, что Вы видели бы эти результаты, если рэнд () производит случайное 16-разрядное число. (Вы, кажется, предполагаете, что это будет 32-разрядное число).
я не могу обещать, что это - ответ, но отправьте свое значение RAND_MAX и немного больше детали о Вашей среде.
Если Вы обеспокоены случайностью а не скоростью, необходимо использовать безопасный метод генерации случайных чисел. Существует несколько способов сделать это... Самый легкий быть для использования OpenSSL Генератор случайных чисел .
можно также записать собственное использование алгоритма шифрования (как AES). Путем выбора семени и IV и затем непрерывно перешифрования вывода функции шифрования. Используя OpenSSL легче, но менее мужествен.
Если Вы в состоянии, используйте Повышение . Мне везло с их случайная библиотека .
uniform_int
должен сделать то, что Вы хотите.
Если RAND_MAX 32767, можно удвоить число битов легко.
int BigRand()
{
assert(INT_MAX/(RAND_MAX+1) > RAND_MAX);
return rand() * (RAND_MAX+1) + rand();
}
[редактирование] Предупреждение: не используйте rand()
для статистики, моделирования, криптографии или чего-либо серьезного.
Это достаточно хорошо для создания чисел взгляд случайный для типичного человека второпях, не больше.
См. ответ @Jefffrey для более оптимальных вариантов, или этот ответ для crypto-безопасных случайных чисел.
<час>Обычно высокие биты показывают лучшее распределение, чем младшие биты, таким образом, рекомендуемый способ генерировать случайные числа диапазона в простых целях:
((double) rand() / (RAND_MAX+1)) * (max-min+1) + min
Примечание : удостоверьтесь, что RAND_MAX+1 не переполняется (благодарит Demi)!
подразделение генерирует случайное число в интервале [0, 1); "расширьте" это к необходимому диапазону. Только, когда max-min+1 рядом с RAND_MAX, Вам нужен "BigRand ()" функция как отправленный Mark Ransom.
Это также избегает некоторых режущих проблем из-за модуля, который может ухудшить Ваши числа еще больше.
<час>встроенный генератор случайных чисел, как гарантируют, не будет иметь качество, требуемое для статистических моделирований. Для чисел нормально "выглядеть случайным" человеку, но для серьезного приложения, необходимо взять что-то лучше - или по крайней мере проверить его свойства (равномерное распределение обычно хорошо, но значения имеют тенденцию коррелировать, и последовательность детерминирована). Knuth имеет превосходное (если трудно к чтению) трактат на генераторах случайных чисел, и я недавно нашел , LFSR, чтобы быть превосходным и чинить простой реализовать, учитывая его свойства хорошо для Вас.