[PYTHON] Essayez de modifier diverses conditions pour "rassembler 1 000 personnes dans la salle et continuer à donner de l'argent à des adversaires aléatoires"

introduction

[«Rassemblez 100 personnes dans une pièce et continuez à donner de l'argent à un partenaire aléatoire» fera progressivement la différence entre riches et pauvres](http://gigazine.net/news/20170711-random-people-give-money-to- Il existe un article de Gigazine intitulé random-other-people /).

Je pense qu'il y a différentes impressions telles que "Oh, c'est vrai" et "Oh, j'ai été surpris", mais comme c'est une expérience simple, j'ai essayé de changer diverses conditions et c'était étonnamment intéressant, alors je vais vous la présenter.

Essayez de modifier diverses conditions pour "rassembler 1 000 personnes dans la salle et continuer à donner de l'argent à des adversaires aléatoires"

J'ai senti qu'il y avait peu de personnes avec 100 personnes, donc je vais essayer avec 1000 personnes.

Si 1000 personnes ont initialement 1000 pièces d'or et donnent au hasard 1 pièce d'or à quelqu'un à chaque tour

Les histogrammes du montant d'argent et du nombre de personnes aux tours 10, 100, 1000 et 10000 sont les suivants.

Kobito.0rXvUI.png

Fondamentalement, cela ressemble à une distribution normale centrée sur 1000. Vous pouvez voir que la base se développe au fur et à mesure que l'essai est répété.

Si 1000 personnes ont initialement 1000 pièces d'or et les donnent au hasard à chaque tour * Lorsque vous les donnez à une personne plus riche qu'eux-mêmes, il y a 10% de chances de repenser à qui les redonner *

Lorsque vous donnez à une personne plus riche que vous-même, il y a 10% de chances de redécider à qui donner.

Kobito.621N5V.png

Il a une distribution similaire, mais a une base plus étroite qu'auparavant. Est-il prudent de dire que la richesse est redistribuée?

Si 1000 personnes ont initialement 1000 pièces d'or et le donnent au hasard à chaque tour * Si vous le donnez à une personne plus pauvre que vous, il y a 10% de chances de repenser à qui le redonner *

Au contraire, lorsque vous donnez à une personne plus pauvre que vous-même, il y a 10% de chances de redécider à qui donner.

Kobito.u3hiSE.png

Cette fois, au contraire, la base s'est considérablement agrandie. C'est une société disparité w Est-ce un microcosme d'une société qui ne demande pas aux pauvres de travailler?

Si 1000 personnes * ont initialement 50 pièces d'or et donnez 1 pièce d'or à quelqu'un au hasard à chaque tour

Cette fois, il n'y a pas de conditions particulières pour donner de l'argent comme le tout premier, mais lorsque la première possession est de 50.

Kobito.FFphBG.png

Le nombre de personnes dont l'argent devient 0 augmente, et ceux qui n'en ont pas ne le donnent à personne, il semble donc assez biaisé.

scénario

C'est le script que j'ai utilisé cette fois. Vous pouvez l'exécuter sur votre bloc-notes Jupyter.

import numpy as np
import seaborn as sns
import matplotlib.pyplot as plt

%matplotlib inline

N = 1000  #Nombre de personnes
M = 1000  #Première possession
P = 0     #Probabilité de repenser lors de la remise aux riches / pauvres.Sinon 0,1%Puis 0.1。
plot_index = [10, 100, 1000, 10000]  #Tournez le nombre pour afficher le graphique
T = max(plot_index)
plt.figure(figsize=(24, 6))


def transfer_money(moneys):
    transfer = np.zeros_like(moneys)
    for i in range(N):
        if moneys[i] > 0:
            while True:
                to_money = np.random.randint(0, N)
                #Si vous ne le donnez pas aux riches: `moneys[to_money] > moneys[i]`
                #Si vous ne le donnez pas aux pauvres: `moneys[to_money] < moneys[i]`
                if moneys[to_money] < moneys[i] and np.random.random() < P:
                    continue
                break
            transfer[i] -= 1
            transfer[to_money] += 1
    moneys += transfer

moneys = np.ones((N, )) * M

for i in range(T+1):
    if i in plot_index:
        plt.subplot(1, len(plot_index), plot_index.index(i)+1)
        ax = sns.distplot(moneys, kde=False, bins=20)
        ax.set_title("i=%d" % i)
        ax.set_xlabel("money")
        ax.set_ylabel("person count")
    transfer_money(moneys)

plt.show()

à la fin

Ce genre de chose est amusant.

Recommended Posts

Essayez de modifier diverses conditions pour "rassembler 1 000 personnes dans la salle et continuer à donner de l'argent à des adversaires aléatoires"
Essayez Cython dans les plus brefs délais
Divers commentaires à écrire dans le programme
Je veux visualiser où et combien de personnes se trouvent dans l'usine
Essayez d'afficher la séquence de Fibonacci dans différentes langues comme pratique d'algorithme