Если кто-то заинтересован в решении, я использовал в Python для генерации случайного значения, близкого к данному числу в качестве параметра. Мое решение существует из четырех этапов. На каждом этапе вероятность того, что сгенерированное число будет ближе к данному числу, больше.
Я знаю, что решение не так красиво, как использование одного дистрибутива, но именно так я смог решить свою проблему:
number_factory.py:
import random
import numpy as np
class NumberFactory:
def __init__(self):
self.functions = [self.__linear, self.__exponential_point_four, self.__exponential_point_three, self.__exponential_point_twenty_five]
self.stage = 0
def next_stage(self):
self.stage += 1
def get_mutated_number(self, number):
# True if the generated number will be higher than the given number
# False if the generated number will be lower than the given number
add = bool(np.random.choice([0,1], p=[number, 1-number]))
# Generate a number between 0 and 1 that will be used
# to multiply the new number by which the number parameter will be substracted or added
# The bigger the stage number (0-3) the more change that the mutated number is close to the number parameter
multiply_number_seed = random.uniform(0, 1)
multiply_number = self.functions[self.stage](multiply_number_seed)
if (add):
return number+((1-number)*multiply_number)
else:
return number-(number*multiply_number)
def __linear(self, x):
return -x+1
def __exponential_point_four(self, x):
return 0.4*x**2 - 1.4*x + 1
def __exponential_point_three(self, x):
return 0.8*x**2 - 1.8*x + 1
def __exponential_point_twenty_five(self, x):
return x**2 - 2*x + 1
def get_stage(self):
return self.stage
main.py:
import matplotlib.pyplot as plt
import numpy as np
factory = NumberFactory()
numbers = []
factory.next_stage()
factory.next_stage()
factory.next_stage()
for _ in range(100000):
numbers.append(factory.get_mutated_number(0.3))
bins = 100
plt.hist(numbers, bins, normed=True)
plt.plot(1, np.ones_like(bins))
plt.show()
Результат при выполнении этого кода показан на рисунке ниже: