meteo.py

Created by schraf

Created on October 24, 2022

878 Bytes

Vidéo d’explication

Prévisions météo

Nous allons générer des journées ensoleillées, nuageuses ou pluvieuses sur 50 ans (365*50 jours) avec la règle suivante que nous tiendrons secrète (et que notre calculatrice devra découvrir toute seule) :

  • Lorsqu’il y a du soleil (S) un jour, le lendemain il y a également du soleil dans 70% des cas. Dans 20% des autres cas le ciel sera nuageux (N) et dans 10% il sera pluvieux (P)

  • Lorsqu’il y a des nuages un jour, le lendemain il y a également des nuages dans 30% des cas. Dans 30% des autres cas le ciel sera ensoleillé et dans 40% il sera pluvieux (P)

  • Lorsqu’il y a de la pluie un jour, le lendemain il y a également de la pluie dans 50% des cas. Dans 20% des autres cas le ciel sera nuageux et dans 30% il sera ensoleillé

Simuler des lois discrètes

Pile ou face équilibré

Il y a plusieurs façons de simuler un lancer de pièce équilibré, par exemple :

>> from random import *
>> choice([0,1])
1

donnera 0 ou 1 dans environ 50% des cas.

>> random()<0.5
True

donnera True ou False également dans environ 50% des cas.

Pièce truquée

Comment simuler une pièce qui donne par exemple 60% de Pile et 40% de Face ? Une version très simple est :

>> random()<0.6
False

donnera True dans 60% des cas et False dans 40%. Pouvait-on utiliser choice ? Oui, par exemple en tapant :

>> >> choice([1]*60+[0]*40)
0

C’est-à-dire en créant une liste de 100 termes (60 fois “1” et 40 fois “0”, la probabilité d’obtenir un “1” est donc bien de 60%). Avouons que ce n’est pas une technique très efficace ! On peut aussi voir que 60% = 3 / 5 et que 40% = 2 / 5, donc au lieu de 100 termes 5 suffisent :

>> >> choice([1,1,1,0,0])
1

Dé truqué

Comment simuler le lancer d’un dé (4 faces pour simplifier) en ayant non pas 25% de chance par face mais par exemple 30% d’avoir le “


from random import *
from kandinsky import *

TPS = "SNP"
METEO = [[0.7,0.2,0.1], [0.3,0.3,0.4], [0.3,0.2,0.5]]
COUL = [65504, 42292, 0]
DUREE = 365*50

def tirage(a):
  i = 0
  choix = random()
  p = METEO[TPS.index(a)]
  s = p[0]
  while choix > s : 
    i += 1
    s += p[i]
  return TPS[i]
  
def annees():
  histo="S"
  for j in range(DUREE):  
      histo=tirage(histo)
      set_pixel(j%320,j//320,COUL[TPS.index(histo)])
  
def go():
  annees()
  for e in range(3):
    res=[[0,0,0],[0,0,0],[0,0,0]]
    prec = 0
    for j in range(1,DUREE):
      c = get_pixel(j%320,j//320)
      n = COUL.index(c)
      res[prec][n]+=1
      prec = n
    for s in range(3):
      draw_string(TPS[e] + " vers " + TPS[s] + " : %.2f" % (res[e][s]/sum(res[e])), 10,62+54*e+16*s)
    draw_string(TPS[e] + " : %.2f" % ((res[0][e]+res[1][e]+res[2][e])/DUREE), 200,62+16*e)