Jos joku on kiinnostunut ratkaisusta, jota käytin Pythonissa tuottaakseni parametrille satunnaisen arvon, joka on lähellä annettua lukua. Ratkaisuni on olemassa neljässä vaiheessa. Jokaisessa vaiheessa mahdollisuus, että luotu luku on lähempänä annettua lukua, on suurempi.
Tiedän, että ratkaisu ei ole yhtä kaunis kuin yhden jakelun käyttö, mutta näin pystyin ratkaisemaan ongelmani:
numero_tehdas.py:
tuoda satunnaisesti
tuo numerotunnus nimellä np
luokka NumberFactory:
def __init __ (itse):
self.functions = [itse .__ lineaarinen, itse .__ eksponentiaalinen_pisteen neljä, itse.
itse. vaihe = 0
def next_stage (itse):
itse. vaihe + = 1
def get_mutated_number (itse, numero):
# Tosi, jos luotu luku on suurempi kuin annettu luku
# Väärin, jos luotu luku on pienempi kuin annettu luku
add = bool (np.satunnainen.valinta ([0,1], p = [numero, 1-numero]))
# Luo luku välillä 0 ja 1, jota käytetään
# kerrotaan uusi luku, jolla numero-parametri vähennetään tai lisätään
# Mitä suurempi vaiheluku (0-3), sitä enemmän muutosta on, että mutatoitu luku on lähellä numeroparametriä
kerro_numero_siemenet = satunnainen. yhtenäinen (0, 1)
moninkertaistaa_luku = itsetoiminnot [oma vaihe] (kerro_numero_siemenet)
jos (lisää):
palautusluku + ((1-numero) * kerro_numero)
muu:
paluuluku- (numero * kerro_numero)
def __lineaarinen (itse, x):
paluu -x + 1
def __exponential_point_four (itse, x):
paluu 0,4 * x ** 2 - 1,4 * x + 1
def __exponential_point_three (itse, x):
paluu 0,8 * x ** 2 - 1,8 * x + 1
def __exponential_point_twenty_five (itse, x):
paluu x ** 2 - 2 * x + 1
def get_stage (itse):
palaa itse. vaihe
main.py:
tuo matplotlib.pyplot plt: ksi
tuo numerotunnus nimellä np
tehdas = NumberFactory ()
numerot = []
factory.next_stage ()
factory.next_stage ()
factory.next_stage ()
_ alueella (100000):
numerot. liitä (tehdas.muutettu_numero (0.3))
astiat = 100
plt.hist (numerot, lokerot, normattu = True)
plt.plot (1, np.ones_like (lokerot))
plt.show ()
Tämän koodin suorittamisen tulos näkyy alla olevassa kuvassa: