[PYTHON] Faisons tourner l'air gacha

introduction

J'ai beaucoup appris dans la merde, alors je l'ai partagé

Idée ancêtre Composant aérien 30 gacha consécutifs

Jusqu'où pouvez-vous dire les éléments qui composent l'air? Azote, oxygène, dioxyde de carbone, argon ... Je ne connaissais pas le reste.

Vous pouvez faire tourner le gacha sur ce site.

Taux d'émission de l'air gacha

Les composants qui composent l'air sont [Air-Wikipedia](https://ja.wikipedia.org/wiki/%E7%A9%BA%E6%B0%97#%E6%88%90%E5%88% Selon 86)

composant Formule chimique Rapport de rapport de volume (vol%)
azote N2 78.084
oxygène O2 20.9476
Argon Ar 0.934
gaz carbonique CO2 0.0390
néon Ne 0.001818
hélium He 0.000524
méthane CH4 0.000181
krypton Kr 0.000114
Le dioxyde de soufre SO2 0.0001
hydrogène H2 0.00005
Monoxyde de diazote N2O 0.000032
xénon Xe 0.0000087
ozone O3 0.000007
Dioxyde d'azote NO2 0.000002
Iode I2 0.000001

Le rapport volumique des composants qui composent l'air est le taux d'émission de gacha.

Code source

air_gacha.py


"""
https://ja.wikipedia.org/wiki/%E7%A9%BA%E6%B0%97#%E6%88%90%E5%88%86
Tableau 1:Composition principale de l'air sec (International Standard Air, 1975)
Formule chimique du composant Rapport volumique (vol)%) Ppm ppb Remarques
Azote N2 78.084	780,840	-	[12]
Oxygène O2 20.9476	209,476	-	[12]
Argon Ar 0.934	9,340	-	[12]
Dioxyde de carbone CO2 0.0390	390	-	+*Valeur 2011[13][12][Note 2]
Néon Ne 0.001818	18.18	-	[12]
Hélium He 0.000524	5.24	-	[12]
Méthan CH4 0.000181	1.81	1813±2	+Valeur 2011[13][12][Note 3]
Crypton Kr 0.000114	1.14	-	[12]
Dioxyde de soufre SO2 0.0001>	1>	-	*[12]
Hydrogène H2 0.00005	0.5	-	[12]
Monoxyde de diazote N2O 0.000032	0.32	324.2±0.1	+*Valeur 2011[13][12][Remarque 4]
Xénon Xe 0.0000087	0.087	87	[12]
Ozone O3 0.000007>	0.07>	70>	*[Remarque 5][12]
Dioxyde d'azote NO2 0.000002>	0.02>	20>	*[12]
Iode I2 0.000001>	0.01>	10>	*[12]
"""
import random
import time
from decimal import Decimal
dic = {"Azote N2":78.084, "Oxygène O2":20.9476, "Argon Ar":0.934, "Dioxyde de carbone CO2":0.0390, "Néon Ne":0.001818, "Hélium He":0.000524, "Méthan CH4":0.000181, "Crypton Kr":0.000114, "Dioxyde de soufre SO2":0.0001, "Hydrogène H2":0.00005, "一酸化二Azote N2O":0.000032, "Xenon Xe":0.0000087, "Ozone O3":0.000007, "Dioxyde d'azote NO2":0.000002, "Iode I2":0.000001}
com = ["azote", "oxygène", "Argon", "gaz carbonique", "néon", "hélium", "méthane", "krypton", "Le dioxyde de soufre", "hydrogène", "一酸化二azote", "xénon", "ozone", "二酸化azote", "Iode"]
che = ["N2", "O2", "Ar", "CO2", "Ne", "He", "CH4", "Kr", "SO2", "H2", "N2O", "Xe", "O3", "NO2", "I2"]
keys = []
for i in dic.keys():
    keys.append(i)
su = 0
for i in dic.keys():
    su += int(Decimal(str(dic[i]))*(10**7))
    dic[i] = int(Decimal(str(dic[i]))*(10**7))
out = [0 for i in range(len(keys))]
que = 10**6
for q in range(que): #10**6 correspond à 10 secondes, 10**7 prend 2 minutes
    t = time.perf_counter()
    random.seed(t)
    ra = random.randint(0, su)
    res = 0
    if 0 <= ra < dic[keys[0]]:
        out[0] += 1
    else:
        res += dic[keys[0]]
        for i in range(1, len(keys)):
            """
            if i >= 5:
                print("!!!!!!!!!!!!")
                print(out)
            """
            if res <= ra < res + dic[keys[i]]:
                out[i] += 1
                break
            res += dic[keys[i]]

#Moitié de la taille,Caractères pleine largeur"Fluctuation"Fonction à formater
import unicodedata
def left(digit, msg):
    for c in msg:
        if unicodedata.east_asian_width(c) in ('F', 'W', 'A'):
            digit -= 2
        else:
            digit -= 1
    return msg + ' '*digit

print("Air gacha" + "{:.0e}".format(que) + "(" + str(que) + ")" + "Communicant")
for i in range(len(keys)):
    print(left(12, com[i]), left(3, che[i]), "{:>7}".format(out[i]))

Résultat d'exécution

Lorsque que = 10 ** 6

Air gacha 1e+06(1000000)Communicant
Azote N2 780580
Oxygène O2 209579
Argon Ar 9406
Dioxyde de carbone CO2 391
Néon Ne 32
Hélium He 5
Méthan CH4 3
Crypton Kr 1
Dioxyde de soufre SO2 2
Hydrogène H2 1
Monoxyde de diazote N2O 0
Xénon Xe 0
Ozone O3 0
Dioxyde d'azote NO2 0
Iode I2 0

Lorsque que = 10 ** 7

Air gacha 1e+07(10000000)Communicant
Azote N2 7809540
Oxygène O2 2092942
Argon Ar 93396
Dioxyde de carbone CO2 3808
Néon Ne 214
Hélium He 54
Méthan CH4 12
Crypton Kr 11
Dioxyde de soufre SO2 6
Hydrogène H2 10
Monoxyde de diazote N2O 6
Xénon Xe 1
Ozone O3 0
Dioxyde d'azote NO2 0
Iode I2 0

Point d'attention

Erreur de nombre à virgule flottante

Soyez prudent lorsque vous manipulez des types de flotteurs. Dans le monde binaire des ordinateurs, lorsqu'il s'agit de fractions, il n'est pas possible de traiter des valeurs précises.

print(0.1 + 0.2)
#Résultat d'exécution: 0.30000000000000004

Où est passé 0.00000000000000004 !!!!!!!! Donc, lorsque vous traitez des fractions en Python, c'est une bonne idée d'utiliser Decimal (). 15. Arithmétique en virgule flottante, ses problèmes et ses limites - Documentation Python 3.8.3

from decimal import Decimal
print(Decimal("0.1") + Decimal("0.2"))
#Résultat d'exécution: 0.3

Dans le code

for i in dic.keys():
    su += int(Decimal(str(dic[i]))*(10**7))
    dic[i] = int(Decimal(str(dic[i]))*(10**7))

La partie marquée de correspond à éviter les erreurs. Lorsque vous essayez de gérer le taux d'émission comme un nombre entier en multipliant par 10 ** 7, une erreur se produit s'il s'agit d'un type à virgule flottante car le calcul est en cours d'exécution.

Création aléatoire

[Time.time () n'est-il pas très précis? --Qiita] (https://qiita.com/takeopy/items/170d0e1ddbf02ef9fbb9) Comme l'instruction for tourne trop rapidement, time.time () générera probablement la même heure et aura la même valeur de départ (ce qui était le cas dans l'environnement Windows). Par conséquent, utilisez le très précis time.perf_counter ().

t = time.perf_counter()
random.seed(t)
ra = random.randint(0, su)

Façonner la «fluctuation» des caractères par demi-largeur et pleine largeur

Affiche les caractères pleine largeur et demi-largeur alignés à l'aide de la bibliothèque de données Unicode de Python --Qiita Essayez de rendre la sortie facile à voir.

for i in range(len(keys)):
    print(left(12, com[i]), left(3, che[i]), "{:>7}".format(out[i]))

Impressions

La probabilité est biaisée.

Recommended Posts

Faisons tourner l'air gacha
Cherchons à partir de la ligne
Désactivez l'avertissement d'infusion
Django-TodoList② ~ Affiche la page de détails ~
Coupons le visage de l'image
Affichons la carte en utilisant Basemap
Décidons le gagnant du bingo