Si vous payez toujours pour minimiser le poids de votre portefeuille, quelle est la répartition de votre portefeuille?
Vérifions cela par simulation.
――10 000 yens est infini. ――Achetez le produit 10 000 fois et voyez la distribution. (Ignorez les 100 premières fois) --Le prix du produit est de 100 yens à 9999 yens, [loi de Benford](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). --Utilisez Méthode de l'alias de Walker pour générer des nombres aléatoires (rand_from_prob).
Tout d'abord, faisons un poids (wgt) de 100 yens à 9999 yens selon la loi de Benford.
python
import numpy as np, matplotlib.pyplot as plt
from math import log
#Loi de Benford
wgt = np.array([log((i+1)/i, 10000) for i in range(100, 10000)])
wgt /= sum(wgt)
plt.plot(wgt)
plt.xlabel('Price')
Définit une modification qui renvoie le nombre après avoir minimisé le poids.
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() #Modèle mathématique
x = [LpVariable('x%d'%i, lowBound=0, cat=LpInteger)
for i in range(len(money_val))] #Quantité après paiement
m += lpDot(money_wgt, x) #Fonction objective(Poids après paiement)
m += lpDot(money_val, x) == price #Montant après paiement
m.solve()
return [int(value(i)) for i in x]
Simulons. Essayons la distribution de billets de 1000 yens.
python
price = 0 #Argent courant
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)) #Distribution de billets de 1000 yens
C'est une probabilité égale. La même chose était vraie pour les autres pièces et les billets de 5000 yens.
Cela semble être une probabilité égale. La distribution du montant total a également une probabilité égale de 0 yen à 9999 yens.
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
c'est tout
Recommended Posts