Создайте случайное число менее 4 цифр, но вероятность его наличия 1, 2 или 3 цифр равна
В настоящее время я использую 1 + (int)(rand() * 999.0 / RAND_MAX)
для генерации случайного числа от 1 до 999 включительно, но числа с двумя и одним разрядом встречаются не так часто, как трехзначные числа.
Как я могу это исправить?
Обратите внимание, что хотя исходный код дает диапазон от 0 до 999 включительно, мне действительно нужен диапазон от 1 до 999 включительно.
Ответы
Ответ 1
Ваше наблюдение, что одно число цифр не встречается так часто, как два и три цифры, не удивительно.
Есть только 9 однозначных чисел (не включая ноль), но есть 90 двузначных чисел и 900 трехзначных. Таким образом, генератор случайных чисел будет отображать числа на этой частоте.
Чтобы генерировать случайные числа в диапазоне [1, 999], так что вероятность их наличия 1, 2 и 3 цифр равна, используйте свой любимый генератор для генерации случайного числа p
, скажем, в диапазоне [0, 1) (см. Новые функции случайной библиотеки в С++ для этого) и преобразуйте его с помощью std::pow(1000, p);
.
Вы должны заметить, что результирующее распределение не будет кусочно-равномерным: то есть вероятность рисования числа с определенным количеством цифр не совпадает с вероятностью рисования любого другого числа с таким количеством цифры. Но он имеет непрерывную и дифференцируемую кумулятивную функцию плотности, которая может быть важна математически.
(Для математически-наклонных преобразование, которое я применяю, является квантильной функцией распределения, которое требуется OP).
Ответ 2
Вы также можете использовать операторы if, которые немного быстрее:
int m=rand();
if(m%3+1==3)
z=(int)rand()%900+100;
else if(m%3+1==2)
z=(int)rand()%90+10;
else if(m%3+1==1)
z=(int)rand()%10;
Разница clock()
для 100 000 000 повторов:
t_pow: 23912
t_if: 6640
Тестовый код с использованием тактовых импульсов для распределения производительности -
ЕСЛИ,
POW
Разница в распределении между вариантом if и pow: Участок в wolframalpha.com
Ответ 3
Вы можете сделать это в одном утверждении, которое использует 2 randoms. Умножает первый на 10 ** секунд. Второе - 1, 2 или 3. Здесь это как формула Excel:
=Int(Rand()*10^(int(Rand()*3)+1))