Имитация реалистичного статистического распределения монет - PullRequest
0 голосов
/ 25 апреля 2019

Скажем, у меня есть 3 разных типа монет.Пример: 10p, 50p и 1 £.Я знаю среднее число вставленных монет для каждого типа в течение дня:

  • 10p: 50 между 10:00 и 16:00, 30 в остальную часть дня
  • 50p: 30между 11:00 и 19:00, 10 в оставшуюся часть дня
  • 1 £: 10 между 13:00 и 15:00, 2 в остальную часть дня

В моем коде у меня есть функцияэто вызывается каждую секунду:

typedef enum
{
    none,
    p10,
    p50,
    P1
} CoinType;

CoinType toosCoin(time_t now) // called every second
{
    CoinType coin = none;
    // do some math

    return coin;
}

Я хочу смоделировать распределение, описанное вышеизложенными параметрами, но я не уверен, что является лучшим подходом или правильным распределением (ями) для использования.

Затем код активирует физическую линию ввода-вывода в соответствии с выбранной монетой (если есть) для запуска входа на электронной плате.Это «стресс-тест» как аппаратного, так и программного обеспечения.Распределения необходимы для обеспечения реалистичных данных для прошивки.

Я думаю, мне нужно что-то вроде распределения Пуассона, но я не понимаю, как связать параметры P. с вышеуказанными ограничениями.

1 Ответ

1 голос
/ 25 апреля 2019

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

Я буду использовать монету 10p в качестве примера, остальные следуют аналогично. Существуют две разные ставки: 50 монет / 6 часов с 10:00 до 16:00 и 30 монет / 18 часов для оставшейся части дня. Поскольку у часа 3600 секунд, они конвертируются в скорости 5/2160 и 1/2160 в секунду соответственно. Это, в свою очередь, можно рассматривать как вероятность получения монеты в секунду. Обратите внимание, что эти вероятности являются приближением, основанным на предположении Пуассона, что вы никогда не получите два или более вхождений в достаточно малом интервале времени. Я подозреваю, что вы можете утверждать, что это разумное предположение на уровне одной секунды, учитывая механизм подачи монет.

Если вы купите это, тогда жизнь станет проще. Когда ваша функция вызывается, сгенерируйте случайное число с плавающей запятой в диапазоне от 0,0 до 1,0. Если это меньше или равно вероятности, связанной с текущим временем, вы получили 10p монеты, в противном случае вы не получили. (Если вместо этого вы предпочитаете целочисленную математику, сгенерируйте int, равномерно распределенный между 1 и 2160, и если он меньше или равен 5 между 10:00 и 16:00 или 1 в течение остальной части дня, вы получаете монету. Просто убедитесь, что не используйте модуль 2160 для получения случайного числа, чтобы не ввести модуль смещения .)

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

...