Я пишу на C / C ++ и хочу создать много случайных чисел, которые превышают 100 000. Как бы я это сделал? С rand();
// Initialize rand()'s sequence. A typical seed value is the return value of time()
srand(someSeedValue);
//...
long range = 150000; // 100000 + range is the maximum value you allow
long number = 100000 + (rand() * range) / RAND_MAX;
Возможно, вам придется использовать что-то большее, чем long int для range
а также number
если (100000 + range)
будет превышать свое максимальное значение.
Вы бы не сделали это с rand
, но с правильным генератором случайных чисел, который поставляется с более новым C ++, см., например, cppreference.com.
const int min = 100000;
const int max = 1000000;
std::default_random_engine generator;
std::uniform_int_distribution<int> distribution(min,max);
int random_int = distribution(generator); // generate random int flat in [min, max]
Не забудьте правильно посеять генератор.
Выше я подразумеваю, что rand
не является «правильным» псевдо-ГСЧ, поскольку обычно имеет ряд недостатков. В лучшем случае ему не хватает абстракции, поэтому выбор из другого распределения становится сложным и подверженным ошибкам (например, поиск в сети «модуля случайного диапазона»). Также AFAIK невозможно заменить основной движок, используемый для генерации случайных чисел. В менее оптимальных случаях rand
поскольку псевдо-ГСЧ не обеспечивает достаточно длинных последовательностей для многих / большинства случаев использования. С TR1 / C ++ 11 генерировать высококачественные случайные числа достаточно легко, чтобы всегда использовать правильное решение, так что вам не нужно в первую очередь беспокоиться о качестве используемого псевдо-RNG, когда обнаруживаются неясные ошибки. Microsoft STL выступила с презентацией, в которой краткий разговор по теме на GoingNative2013.
В общем, вы можете использовать генератор случайных чисел, который идет между 0 и 1, и получить любой диапазон, который вы хотите, выполнив следующее преобразование:
x' = r x + b
Так что если вы хотите случайные числа, скажем, между 100 000 и 300 000, и x
ваше случайное число от 0 до 1, то вы бы установить r
быть 200 000 и b
быть 100 000 и x'
будет в пределах диапазона, который вы хотите.
Если у вас еще нет доступа к встроенным функциям C ++, в Boost есть куча реальных рандомизаторов в Boost.Random, в том числе конкретные решения для вашего очевидного пространства проблем.
Я бы повторил комментарии о том, что уточнение правок в вашем вопросе улучшит точность ответов, например. «Мне нужны равномерно распределенные целые числа от 100 001 до 1 000 000».