En af de løsningsmetoder som jeg skitserede under mit indlæg Thread-safe Random Numbers var at oprette en tråd som stod for genereringen af de tilfældige tal. Den metode skulle sikre at resultat var reproducerbart og at man stadig kunne bruge sin favorit talgenerator (Mersenne Twister er et godt bud på en favoritgenerator). Selvom det er en relativt simpel løsning, betyder det jo ikke at man ikke skal tænke sig om. Min første indskydelse var at generere en masse uniform variable i en pool og så transformere dem til f.eks. normalfordelte i løbet af selve simuleringen. Det minimerer tidsforbruget i generatortråden og overlader det til simuleringstrådene.
Det giver dog et lille problem.

Den bedste måde at generere normalfordelte tilfældige tal er at benytte polar Box-Müller som er givet ved

do 
{ 
  x = 2.0 * Random() - 1.0; 
  y = 2.0 * Random() - 1.0; 
  w = x * x + y * y; 
} 
while (w >= 1.0 || w == 0.0) 
w = Math.Sqrt(-2.0 * Math.Log(w) / w); 
x *= w; 
y *= w; 

Ovenstående kode giver os to normaltfordelte tal, men bruger MINDST to ligefordelte tal. Vi ved altså ikke på forhånd hvor mange ligefordelte tal vi skal bruge, hvilket forkaster min udmiddelbare indskydelse. I stedet vil jeg nu skabe en række streams som er generede med den ønskede fordeling. Generator tråden får altså mere arbejde, men alternativet er ikke et reelt alternativ, da det er svært at vide om man er på den sikre side hvis man vil generere rigeligt med ligefordelt tal.

Man kunne indvende at jeg kunne vælge en anden form af Box-Müller, som bruger præcis to ligefordelte tal til at generere to normal fordelte. Hvis vi ser bort fra at denne metode er langsommere og mindre numerisk stabil, så er der jo andre fordelinger som har samme problem, f.eks. Poissonfordelingen. Det antyder at vi bare skal løse problemet med det samme.

Kommentarer

Mac Switzerland siger:

5. marts 2009 22:42

...men du vidste jo at det _måtte_ gå galt når en del af navnet er Müller!? ;o)

t4rzsan Denmark siger:

6. marts 2009 14:47

Er det under alle omstændigheder ikke også simulationstrådene, der får mest travlt?

ne0san Denmark siger:

9. marts 2009 11:18

Det kan man håbe på, men den bør jo ikke stille alle simulationstrådene i kø fordi man ikke tænker sig om.

Kommentarerne er lukkede