У меня есть функция choose(elems) -> elem
, которая вызывает rand()
, что делает ее недетерминированной.
Чтобы лучше это проверить, я подумал, что можно разделить эту функцию на две части,
generate_choices(elems, ...) -> distribution
choose(distribution) -> elem
где choose()
- это тонкая оболочка вокруг rand()
, а generate_choices()
создает распределение, из которого можно нарисовать элемент. Затем я могу детерминистически проверить, что это распределение вероятностей соответствует ожидаемому.
Распределение равномерно , но с двумя условиями:
- Если не хватает
elems
, добавьте случайный запасной элемент равномерно.
- Если все еще недостаточно
elems
, добавьте случайный элемент по умолчанию равномерно.
Некоторые примеры:
generate_choices([a, b, c, d], [], []) -> [a, b, c, d]
generate_choices([a, b, c], [fallback1], []) -> [a, b, c, fallback1]
generate_choices([a, b, c], [fb1, fb2], []) -> [a, b, c, (fb1 | fb2)]
generate_choices([a, b], [fb1, fb2], [default1]) -> [a, b, (fb1 | fb2), default1]
generate_choices([a, b], [fb1, fb2], [d1, d2]) -> [a, b, (fb1 | fb2), (d1 | d2) ]
generate_choices([a], [fb1, fb2], [d1, d2]) -> [a, (fb1|fb2), (d1|d2) ]
Мой вопрос: как мне моделировать distribution
?
- Если я выберу простой список и вызову
rand()
из generate_choices()
, чтобы заполнить отступление и по умолчанию , тогда я могу проверить только некоторые детерминированные части generate_choices()
.
- Если я выберу три списка,
(elems, fallback, default)
, тогда generate_choices()
будет полностью детерминированным, но тогда choice()
станет менее тривиальным и в любом случае должен быть проверен более тщательно.