[PYTHON] Simulation des Inhalts der Brieftasche

Verteilung von Scheinen und Münzen

Wenn Sie immer zahlen, um das Gewicht Ihrer Brieftasche zu minimieren, wie verteilt sich Ihre Brieftasche?

Simulation

Lassen Sie es uns durch Simulation überprüfen.

10.000 Yen sind unendlich. ――Kaufen Sie das Produkt 10.000 Mal und sehen Sie sich die Verteilung an. (Ignoriere die ersten 100 Male)

  • Der Preis des Produkts beträgt 100 Yen bis 9999 Yen, [Benfords Gesetz](https://ja.wikipedia.org/wiki/%E3%83%99%E3%83%B3%E3%83%95 % E3% 82% A9% E3% 83% BC% E3% 83% 89% E3% 81% AE% E6% B3% 95% E5% 89% 87).
  • Verwenden Sie die Walker-Alias-Methode, um Zufallszahlen (rand_from_prob) zu generieren.
  • Das Gewicht nach der Zahlung minimieren wird durch [Kombinationsoptimierung] berechnet (http://qiita.com/Tsutomu-KKE@github/items/bfbf4c185ed7004b5721).

Mit Python berechnet

Lassen Sie uns zuerst ein Gewicht (wgt) von 100 Yen bis 9999 Yen gemäß dem Gesetz von Benford herstellen.

python


import numpy as np, matplotlib.pyplot as plt
from math import log
#Benfords Gesetz
wgt = np.array([log((i+1)/i, 10000) for i in range(100, 10000)])
wgt /= sum(wgt)
plt.plot(wgt)
plt.xlabel('Price')

image

Definiert eine Änderung, die die Zahl nach Minimierung des Gewichts zurückgibt.

python


from pulp import *
money_val = (1, 5, 10, 50, 100, 500, 1000, 5000)
money_wgt = (1.0, 3.7, 4.5, 4.0, 4.8, 7.0, 1.0, 1.0)
def change(price):
    m = LpProblem() #Mathematisches Modell
    x = [LpVariable('x%d'%i, lowBound=0, cat=LpInteger)
         for i in range(len(money_val))] #Menge nach Zahlungseingang
    m += lpDot(money_wgt, x) #Zielfunktion(Gewicht nach Zahlungseingang)
    m += lpDot(money_val, x) == price #Betrag nach Zahlungseingang
    m.solve()
    return [int(value(i)) for i in x]

Lass uns simulieren. Versuchen wir die Verteilung von 1000-Yen-Scheinen.

python


price = 0 #Aktuelles Geld
warm, nrun = 100, 10000
res = []
for i, p in enumerate(rand_from_prob(wgt, warm+nrun)):
    price -= p
    if price < 0:
        price += 10000
    if price:
        res.append(change(price))
a = np.array(res[-nrun:])
plt.hist(a[:,6], bins=5, range=(0, 5)) #Verteilung von 1000 Yen Rechnungen

image

Es ist eine gleiche Wahrscheinlichkeit. Gleiches galt für andere Münzen und 5000-Yen-Scheine.

Fazit

Es scheint die gleiche Wahrscheinlichkeit zu sein. Die Verteilung des Gesamtbetrags hat ebenfalls eine gleiche Wahrscheinlichkeit von 0 Yen bis 9999 Yen.

python


import pandas as pd
from itertools import product
r2, r5 = range(2), range(5)
ptn = [np.dot(money_val, n) for nn in 
       product(r5, r2, r5, r2, r5, r2, r5, r2)]
plt.hist(ptn)
print(pd.DataFrame(ptn).describe())
>>>
                 0
count  10000.00000
mean    4999.50000
std     2886.89568
min        0.00000
25%     2499.75000
50%     4999.50000
75%     7499.25000
max     9999.00000

image

das ist alles

Recommended Posts