Генерируйте случайные числа однородно по всему диапазону

83
задан Peter Mortensen 1 August 2013 в 18:11
поделиться

10 ответов

Я просто нашел это в Интернете. Это должно работать:

DWORD random = ((min) + rand()/(RAND_MAX + 1.0) * ((max) - (min) + 1));
-3
ответ дан Peter Mortensen 24 November 2019 в 08:43
поделиться

Решение, данное человек 3 рэнда для числа между 1 и 10 содержащих:

j = 1 + (int) (10.0 * (rand() / (RAND_MAX + 1.0)));

В Вашем случае, это было бы:

j = min + (int) ((max-min+1) * (rand() / (RAND_MAX + 1.0)));

, Конечно, это не идеальная случайность или однородность, как некоторые другие сообщения указывают, но это достаточно для большинства случаев.

0
ответ дан Peter Mortensen 24 November 2019 в 08:43
поделиться

По их характеру небольшая выборка случайных чисел не должна быть равномерно распределена. Они случайны, в конце концов. Я соглашаюсь, что, если генератор случайных чисел генерирует числа, которые последовательно, кажется, сгруппированы, тогда существует, вероятно, что-то не так с ним.

, Но имеют в виду, что случайность не обязательно универсальна.

Редактирование: Я добавил "небольшую выборку" для разъяснения.

0
ответ дан Kluge 24 November 2019 в 08:43
поделиться

Если Вы хотите, чтобы числа были равномерно распределены по диапазону, необходимо разбить диапазон во многие равные разделы, которые представляют число очков, в котором Вы нуждаетесь. Тогда получите случайное число с минутой / макс. для каждого раздела.

Как другое примечание, Вы не должны, вероятно, использовать рэнд (), поскольку это не очень хорошо при фактической генерации случайных чисел. Я не знаю, на какой платформе Вы работаете, но существует, вероятно, лучшая функция, которую можно вызвать как случайный ().

2
ответ дан Jason Coco 24 November 2019 в 08:43
поделиться

Проверьте, какой RAND_MAX находится в Вашей системе - я предполагаю, что это - только 16 битов, и Ваш диапазон является слишком большим для него.

Кроме того посмотрите это обсуждение: Генерирующие Случайные Целые числа в Желаемом Диапазоне и примечания по использованию (или не) рэнд C () функция .

3
ответ дан Rob Walker 24 November 2019 в 08:43
поделиться

Необходимо посмотреть на RAND_MAX для конкретного компилятора/среды. Я думаю, что Вы видели бы эти результаты, если рэнд () производит случайное 16-разрядное число. (Вы, кажется, предполагаете, что это будет 32-разрядное число).

я не могу обещать, что это - ответ, но отправьте свое значение RAND_MAX и немного больше детали о Вашей среде.

5
ответ дан abelenky 24 November 2019 в 08:43
поделиться

Если Вы обеспокоены случайностью а не скоростью, необходимо использовать безопасный метод генерации случайных чисел. Существует несколько способов сделать это... Самый легкий быть для использования OpenSSL Генератор случайных чисел .

можно также записать собственное использование алгоритма шифрования (как AES). Путем выбора семени и IV и затем непрерывно перешифрования вывода функции шифрования. Используя OpenSSL легче, но менее мужествен.

8
ответ дан Peter Mortensen 24 November 2019 в 08:43
поделиться

Если Вы в состоянии, используйте Повышение . Мне везло с их случайная библиотека .

uniform_int должен сделать то, что Вы хотите.

9
ответ дан Peter Mortensen 24 November 2019 в 08:43
поделиться

Если RAND_MAX 32767, можно удвоить число битов легко.

int BigRand()
{
    assert(INT_MAX/(RAND_MAX+1) > RAND_MAX);
    return rand() * (RAND_MAX+1) + rand();
}
11
ответ дан Mark Ransom 24 November 2019 в 08:43
поделиться

[редактирование] Предупреждение: не используйте 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, чтобы быть превосходным и чинить простой реализовать, учитывая его свойства хорошо для Вас.

58
ответ дан Community 24 November 2019 в 08:43
поделиться
Другие вопросы по тегам:

Похожие вопросы: