[PYTHON] Versuchen Sie, verschiedene Bedingungen zu ändern, um "1000 Personen im Raum zu sammeln und weiterhin zufälligen Gegnern Geld zu geben".

Einführung

["Versammle 100 Personen in einem Raum und gib weiterhin Geld an einen zufälligen Partner" wird allmählich einen Unterschied zwischen Arm und Reich machen](http://gigazine.net/news/20170711-random-people-give-money-to- Es gibt einen Gigazine-Artikel namens random-other-people /).

Ich denke, es gibt verschiedene Eindrücke wie "Oh, das stimmt" und "Oh, ich war überrascht", aber da es ein einfaches Experiment ist, habe ich versucht, verschiedene Bedingungen zu ändern, und es war überraschend interessant, also werde ich es vorstellen.

Versuchen Sie, verschiedene Bedingungen zu ändern, um "1000 Personen im Raum zu sammeln und weiterhin zufälligen Gegnern Geld zu geben".

Ich hatte das Gefühl, dass es nur wenige Leute mit 100 Leuten gab, also werde ich es mit 1000 Leuten versuchen.

Wenn 1000 Leute anfänglich 1000 Gold haben und jemandem in jeder Runde zufällig 1 Gold geben

Die Histogramme des Geldbetrags und der Anzahl der Personen in den Runden 10, 100, 1000 und 10000 lauten wie folgt.

Kobito.0rXvUI.png

Grundsätzlich fühlt es sich wie eine Normalverteilung an, die auf 1000 zentriert ist. Sie können sehen, dass sich die Basis erweitert, wenn der Versuch wiederholt wird.

Wenn 1000 Leute anfänglich 1000 Gold haben und es zufällig in jeder Runde geben * Wenn Sie es einer reicheren Person als sich selbst geben, besteht eine 10% ige Chance zu überdenken, wer es erneut geben soll *

Wenn Sie einer reicheren Person als Ihnen geben, besteht eine 10% ige Chance, erneut zu entscheiden, wer gegeben werden soll.

Kobito.621N5V.png

Es hat eine ähnliche Verteilung, aber eine engere Basis als zuvor. Kann man mit Sicherheit sagen, dass Reichtum umverteilt wird?

Wenn 1000 Leute anfänglich 1000 Gold haben und es zufällig in jeder Runde geben * Wenn Sie es einer ärmeren Person als Ihnen geben, besteht eine 10% ige Chance zu überdenken, wer es erneut geben soll *

Im Gegenteil, wenn Sie einer ärmeren Person als Ihnen geben, besteht eine 10% ige Chance, erneut zu entscheiden, wer gegeben werden soll.

Kobito.u3hiSE.png

Im Gegenteil, diesmal hat sich die Basis stark erweitert. Es ist eine Disparitätsgesellschaft w Ist es ein Mikrokosmos einer Gesellschaft, die die Armen nicht zur Arbeit auffordert?

Wenn 1000 Personen * anfänglich 50 Gold haben und in jeder Runde zufällig 1 Gold an jemanden geben

Dieses Mal gibt es keine besonderen Bedingungen, um Geld zu geben, wie beim allerersten, aber wenn der erste Besitz 50 ist.

Kobito.FFphBG.png

Die Anzahl der Menschen, deren Geld 0 wird, steigt, und diejenigen, die kein Geld haben, geben es niemandem, so dass es ziemlich voreingenommen zu sein scheint.

Skript

Dies ist das Skript, das ich dieses Mal verwendet habe. Sie können es auf Ihrem Jupyter Notebook ausführen.

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

%matplotlib inline

N = 1000  #Anzahl der Personen
M = 1000  #Erster Besitz
P = 0     #Wahrscheinlichkeit des Umdenkens bei der Übergabe an Arm / Reich.Wenn nicht 0.1%Dann 0.1。
plot_index = [10, 100, 1000, 10000]  #Drehen Sie die Nummer, um das Diagramm anzuzeigen
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)
                #Wenn Sie es nicht den Reichen geben: `moneys[to_money] > moneys[i]`
                #Wenn du es nicht den Armen gibst: `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()

schließlich

So etwas macht Spaß.

Recommended Posts

Versuchen Sie, verschiedene Bedingungen zu ändern, um "1000 Personen im Raum zu sammeln und weiterhin zufälligen Gegnern Geld zu geben".
Probieren Sie Cython in kürzester Zeit aus
Verschiedene Kommentare im Programm zu schreiben
Ich möchte visualisieren, wo und wie viele Leute in der Fabrik sind
Versuchen Sie, die Fibonacci-Sequenz im Namen der Algorithmuspraxis in verschiedenen Sprachen anzuzeigen