Подтвердить что ты не робот

Создайте случайное число менее 4 цифр, но вероятность его наличия 1, 2 или 3 цифр равна

В настоящее время я использую 1 + (int)(rand() * 999.0 / RAND_MAX) для генерации случайного числа от 1 до 999 включительно, но числа с двумя и одним разрядом встречаются не так часто, как трехзначные числа.

Как я могу это исправить?

Обратите внимание, что хотя исходный код дает диапазон от 0 до 999 включительно, мне действительно нужен диапазон от 1 до 999 включительно.

4b9b3361

Ответ 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))