Ett klassiskt exempel av en Monte Carlo-metod skulle vara att uppskatta värdet för talet π genom att lotta slumptalen x och y mellan [–1,1] och se hur stor andel punkter (x,y) som faller inuti enhetscirkeln med medelpunkten i origo. Om x2+y2 ≤ 1, faller punkten på cirkelns omkrets eller inuti, och om x2+y2 > 1, är punkten utanför cirkeln.
Å andra sidan vet man av jämnt fördelade slumptal att sannolikheten att falla på ett visst område är proportionellt med områdets area. Enhetscirkelns area är π·12 = π och den omkretsande kvadratens area är 2·2 = 4. Sannolikheten för en enskild punkt (x,y) att falla inuti cirkeln är alltså π/4.
När vi värderar n punkter (x,y), varav k faller inuti cirkeln, gäller enligt lagen om stora tal k/n ≈ π/4 och närmevärdet är sannolikt bättre ju större n är. Närmevärdet för talet π fås alltså med stora värden för talet n π ≈ 4·k/n.
Till exempel i följande bild n = 10000, k = 7848 och π ≈ 4·7848/10000 ≈ 3,139.
När den används ser koden ut så här:
import random traffar = 0 n = 10000 for i in range(n): x = random.uniform(-1,1) y = random.uniform(-1,1) if x**2 + y**2 <= 1: traffar += 1 print(traffar) print(4*traffar/n) # pi
Till exempel kan en komplex fysiksimulering som innehåller slumpmässighet köras många gånger och slutresultatens sannolikhetsfördelning uppskattas utgående från Monte Carlo-fördelningen. Ett annat exempel på Monte Carlo-metoderna är att rendera bilder med path tracing-teknik: när tillräckligt många ljusstrålars delvis slumpmässiga reflektioner och brytning i en 3D-modell följs antingen från ljuskällan till kameran eller från kameras till ljuskällan, kan man som medeltal av det ljus de producerar få en realistisk bild. För att få en god kvalitet krävs lång beräkningstid.
Bild producerad med Path tracing-teknik (källa, gjord av pseudonymen Qutorial, CC-BY-SA 4.0-licens)
Gör en kod, som genererar 1000 punkter ur rektangeln B. Programmet ska på varandra följande rader skriva ut
Tips: Med kommandot import random
får du tillgång till biblioteket random
, med vars kommando random.uniform(a,b)
du får ett pseudoslumpmässigt reellt tal mellan [a,b].
Skriv ditt program här:
Gör detta genom att göra en simulation av 1000 tärningskast och beräkna medelvärdet av antalet kast. Tärningen är en vanlig tärning med poängtalen 1–6.
Tips: Ett slumpmässigt heltal mellan [a,b] fås med random
-bibliotekets kommando random.randint(a,b)
.
Skriv ditt program här: