[PYTHON] J'ai essayé d'estimer le rapport de circonférence π de manière probabiliste

C'est une histoire que j'ai essayé d'estimer le rapport de circonférence de manière probabiliste (à proprement parler, méthode de Monte Carlo) en utilisant la bibliothèque standard de Python aléatoire. (Temps de lecture prévu: 4 minutes)

Façon de penser

Imaginez les coordonnées xy. pi1.png

Tracez un cercle de rayon r (appelons-le C) centré sur l'origine O et un carré de côté 2r (appelons-le S). pi2.png

En S, continuez à frapper des points au hasard. pi3.png

Lorsque vous atteignez suffisamment de points pour remplir l'intérieur de S, vous pouvez dire "le nombre de points dans S: le nombre de points dans C ≒ l'aire de S: l'aire de C". pi4.png

Si le nombre de points dans S est "s_dot_num" et le nombre de points dans C est "c_dot_num",

(c_dot_num) / (s_dot_num) = Aire de C / Aire de S = (π * r au carré) / (2r) au carré  = π / 4

Parce que ça devient

π = 4 * (c_dot_num) / (s_dot_num)

J'ai pu définir. Après cela, si vous pouvez trouver respectivement c_dot_num et s_dot_num, vous pouvez estimer la valeur de π. (La valeur de r ne semble pas avoir d'importance)

code

Cette fois, je l'ai écrit en Python.

estimate_pi.py


#Les points sont placés au hasard dans un carré avec une longueur de côté de 1, et le rapport de circonférence est estimé.
import random

def estimate_pi(n):
    c_dot_num = 0
    s_dot_num = 0
    for _ in range(n):
        x = random.uniform(0, 1)
        y = random.uniform(0, 1)
        distance = x**2 + y**2
        if distance <= 1:
            c_dot_num += 1
        s_dot_num += 1
    pi = 4 * c_dot_num / s_dot_num
    return pi

if __name__ == '__main__':
    print('Lorsqu'il y a 100 points, le rapport de circonférence est{}'.format(estimate_pi(100)))
    print('Lorsqu'il y a 1000 points, le rapport de circonférence est{}'.format(estimate_pi(1000)))
    print('Lorsqu'il y a 10000 points, le rapport de circonférence est{}'.format(estimate_pi(10000)))
    print('Lorsqu'il y a 100 000 points, le rapport de circonférence est{}'.format(estimate_pi(100000)))

※image pi5.png

Résultat d'exécution

Première fois r1.png Deuxième fois r2.png Troisième fois r3.png

Il s'agit d'environ 3,141. À mesure que le nombre d'essais n (= le nombre de fois pour atteindre le point) augmente, la précision augmente.

Résumé

Cette fois, j'ai essayé d'estimer le rapport de circonférence en utilisant des nombres aléatoires. Sur le plan académique, la méthode d'estimation d'une certaine valeur à l'aide de nombres aléatoires est appelée «méthode de Monte Carlo».

Le code en lui-même n'est pas du tout difficile, mais quand je l'ai appris pour la première fois, j'étais ravi de dire: "Existe-t-il une telle approche!", Donc pour rappel.

Recommended Posts

J'ai essayé d'estimer le rapport de circonférence π de manière probabiliste
J'ai essayé d'estimer la section.
J'ai essayé de déplacer le ballon
J'ai essayé de résumer la commande umask
J'ai essayé de reconnaître le mot de réveil
J'ai essayé de résumer la modélisation graphique.
J'ai essayé de toucher l'API COTOHA
J'ai essayé Web Scraping pour analyser les paroles.
J'ai essayé d'optimiser le séchage du linge
J'ai essayé de sauvegarder les données avec discorde
J'ai essayé de trouver le rapport de circonférence par 100 millions de chiffres
Qiita Job J'ai essayé d'analyser le travail
LeetCode j'ai essayé de résumer les plus simples
J'ai essayé de mettre en œuvre le problème du voyageur de commerce
J'ai essayé de vectoriser les paroles de Hinatazaka 46!
J'ai essayé d'estimer la similitude de l'intention de la question en utilisant Doc2Vec de gensim
(Python) J'ai essayé d'analyser 1 million de mains ~ J'ai essayé d'estimer le nombre d'AA ~
J'ai essayé d'entraîner la fonction péché avec chainer
J'ai essayé de représenter graphiquement les packages installés en Python
J'ai essayé d'apprendre PredNet
J'ai essayé de détecter l'iris à partir de l'image de la caméra
J'ai essayé de résumer la forme de base de GPLVM
J'ai essayé de toucher un fichier CSV avec Python
J'ai essayé de prédire le match de la J League (analyse des données)
J'ai essayé d'organiser SVM.
J'ai parlé à Raspberry Pi
J'ai essayé d'implémenter PCANet
J'ai essayé d'approcher la fonction sin en utilisant le chainer
J'ai essayé la bibliothèque changefinder!
J'ai essayé de mettre Pytest dans la bataille réelle
[Python] J'ai essayé de représenter graphiquement le top 10 des ombres à paupières
J'ai essayé de réintroduire Linux
J'ai essayé de visualiser les informations spacha de VTuber
J'ai essayé de présenter Pylint
J'ai essayé d'effacer la partie négative de Meros
J'ai essayé de résoudre le problème avec Python Vol.1
J'ai essayé de résumer SparseMatrix
J'ai essayé de simuler la méthode de calcul de la moyenne des coûts en dollars
J'ai essayé de refaire la factorisation matricielle non négative (NMF)
jupyter je l'ai touché
J'ai essayé d'implémenter StarGAN (1)
J'ai essayé d'identifier la langue en utilisant CNN + Melspectogram
J'ai essayé de compléter le graphe de connaissances en utilisant OpenKE
J'ai essayé de classer les voix des acteurs de la voix
J'ai essayé de compresser l'image en utilisant l'apprentissage automatique
J'ai essayé de résumer les opérations de chaîne de Python
Quand j'ai essayé de faire une communication socket avec Raspberry Pi, le protocole était différent
J'ai essayé de trouver l'entropie de l'image avec python
J'ai essayé de découvrir les grandes lignes de Big Gorilla
J'ai essayé d'introduire l'outil de génération de diagramme blockdiag
J'ai essayé de porter le code écrit pour TensorFlow sur Theano
[Courses de chevaux] J'ai essayé de quantifier la force du cheval de course
J'ai essayé de simuler la propagation de l'infection avec Python
J'ai essayé d'obtenir les informations de localisation du bus Odakyu
J'ai essayé de trouver la moyenne de plusieurs colonnes avec TensorFlow
J'ai essayé de notifier les informations de retard de train avec LINE Notify
J'ai essayé de résumer le code souvent utilisé dans Pandas