Сначала немного предыстории моей ситуации:
Мне нужно случайное распределение tri angular, и я планировал использовать Python random.tri angular. Ниже приводится исходный код (Python 3.6.2):
def triangular(self, low=0.0, high=1.0, mode=None):
"""Triangular distribution.
Continuous distribution bounded by given lower and upper limits,
and having a given mode value in-between.
http://en.wikipedia.org/wiki/Triangular_distribution
"""
u = self.random()
try:
c = 0.5 if mode is None else (mode - low) / (high - low)
except ZeroDivisionError:
return low
if u > c:
u = 1.0 - u
c = 1.0 - c
low, high = high, low
return low + (high - low) * (u * c) ** 0.5
Я просмотрел указанную вики-страницу и обнаружил, что в моем желаемом использовании был особый случай , который упрощает вещи, и может быть реализована с помощью следующей функции:
def random_absolute_difference():
return abs(random.random() - random.random())
Выполнение некоторых быстрых расчетов времени показывает значительное ускорение с упрощенной версией (эта операция будет повторяться гораздо больше миллиона раз при каждом запуске моего кода):
>>> import timeit
>>> timeit.Timer('random.triangular(mode=0)','import random').timeit()
0.5533245000001443
>>> timeit.Timer('abs(random.random()-random.random())','import random').timeit()
0.16867640000009487
Итак, теперь вопрос: я знаю, что модуль random python использует только псевдослучайность, а random.tri angular использует одно случайное число, в то время как код особого случая использует 2 случайных числа. Будут ли результаты особого случая значительно менее случайными, потому что они используют 2 последовательных вызова random, а random.tri angular использует только один? Есть ли какие-либо другие непредвиденные побочные эффекты от использования упрощенного кода?
Изменить: в отношении этого решения другого вопроса я создал графики гистограмм для обоих дистрибутивов, показывая, что они сопоставимы :
Случайное тройное angular распределение:
Special case simplified distribution:
Упрощенное распространение в особых случаях