यदि कोई व्यक्ति पायथन में उपयोग किए गए समाधान में रुचि रखता है, तो पैरामीटर के रूप में दी गई संख्या के करीब यादृच्छिक मूल्य पैदा करने के लिए। मेरा समाधान चार चरणों में मौजूद है। प्रत्येक चरण मौका है कि उत्पन्न संख्या दी गई संख्या के करीब है।
मुझे पता है कि समाधान एक वितरण का उपयोग करने के रूप में सुंदर नहीं है, लेकिन यह वह तरीका था जिससे मैं अपनी समस्या को हल करने में सक्षम था:
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()
इस कोड को निष्पादित करते समय परिणाम नीचे दी गई तस्वीर में दिखाया गया है: