หากใครบางคนสนใจวิธีการแก้ปัญหาที่ฉันใช้ใน 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()
ผลเมื่อรันโค้ดนี้จะแสดงในภาพด้านล่าง:
