С помощью функции синуса можно обеспечить так называемое смещение. Механизм мне не совсем понятен.
В скрипте ниже с помощью функции my_random()
генерируется случайное число. При этом синус и m
обеспечивают, чтобы это число с большей вероятностью оказалось в определенном диапазоне. В зависимости от переданного m
вероятность оказаться в том или ином диапазоне разная.
Коэффициенты (m
) подобраны. Все равно идеального распределения «неравновероятности» таким способом достигнуть не удалось.
import math
import random
def my_random(m):
n = math.sin(random.random() * m)
return round(n, 3)
def analysis(l):
a = {'a':0, 'b':0, 'c':0, 'd':0, 'zero':0, 'one':0, '-':0}
for i in l:
if 0 < i <= 0.249:
a['a'] += 1
elif 0.250 <= i <= 0.499:
a['b'] += 1
elif 0.500 <= i <= 0.749:
a['c'] += 1
elif 0.750 <= i <= 0.999:
a['d'] += 1
elif i == 0:
a['zero'] += 1
elif i == 1:
a['one'] += 1
else:
a['-'] += 1
b = {}
for i in a:
b[i] = round((a[i] / qty) * 100 , 2)
print (b)
coef = [0.85, 0.9, 1, 1.1, 1.2, 1.3, 1.4, 1.5]
qty = 1000
for j in coef:
l = []
for i in range(qty):
l.append(my_random(j))
analysis(l)
Пример результата работы скрипта:
{'a': 30.9, 'c': 35.4, 'b': 33.4, 'd': 0.3, '-': 0.0, 'one': 0.0, 'zero': 0.0}
{'a': 27.0, 'c': 37.4, 'b': 29.3, 'd': 6.2, '-': 0.0, 'one': 0.0, 'zero': 0.1}
{'a': 24.5, 'c': 34.1, 'b': 25.1, 'd': 16.1, '-': 0.0, 'one': 0.0, 'zero': 0.2}
{'a': 23.3, 'c': 28.2, 'b': 23.9, 'd': 24.6, '-': 0.0, 'one': 0.0, 'zero': 0.0}
{'a': 21.0, 'c': 27.4, 'b': 24.3, 'd': 27.2, '-': 0.0, 'one': 0.0, 'zero': 0.1}
{'a': 19.5, 'c': 26.2, 'b': 18.7, 'd': 35.5, '-': 0.0, 'one': 0.0, 'zero': 0.1}
{'a': 18.2, 'c': 23.1, 'b': 21.0, 'd': 37.7, '-': 0.0, 'one': 0.0, 'zero': 0.0}
{'a': 14.8, 'c': 23.9, 'b': 19.4, 'd': 41.9, '-': 0.0, 'one': 0.0, 'zero': 0.0}