누군가가 솔루션에 관심이 있다면 주어진 숫자에 가까운 임의의 값을 매개 변수로 생성하기 위해 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()
이 코드를 실행할 때의 결과는 아래 그림에 나와 있습니다.