| 
					
							
        
    
        
						
			 | 
			
			
					    
					
        
         
          
         
	
            | "tilfældigt" normalfordelt tal. Fra : Anders Wegge Keller | 
  Dato :  02-05-09 14:43 |  
  |  
 
             Jeg har været for længe væk fra skolebænken til at jeg helt kan huske
 hvordan det er det hænger sammen med normalfordelinger. Så bær over
 med at jeg muligvis stiller et indlysende spørgsmål, eller tåger rundt
 i begreberne.
  Jeg har brug for en metode til at transformere et tilfældigt tal i
 intervallet [0..1] til en værdi, der vil være normalfordelt med
 maksimum omkring 9 til 10 med en spredning på ca 1. Derudover skal
 fordelingen være skæv, sådan at sandsynligheden for værdien 5 er den
 samme som sandsynligheden for 28. Jeg har googlet lidt rundt, og har
 fundet noget, der kan lave en symmetrisk normalfordeling her:
 < http://www.taygeta.com/random/gaussian.html> Desværre er jeg så
 rusten, så jeg ikke lige kan gennemskue hvordan jeg kan manipulere den
 algoritme til at give mig et asymmetrisk resultat. 
 -- 
 /Wegge
            
              |   |   
            
        
 
            
         
           TA (02-05-2009) 
         
	
            | Kommentar Fra : TA | 
  Dato :  02-05-09 20:27 |  
  |  
 
            "Anders Wegge Keller" <wegge@wegge.dk> wrote in message
 news:87vdojmxij.fsf@huddi.jernurt.dk...
 >
 >  Jeg har brug for en metode til at transformere et tilfældigt tal i
 > intervallet [0..1] til en værdi, der vil være normalfordelt med
 > maksimum omkring 9 til 10 med en spredning på ca 1. Derudover skal
 > fordelingen være skæv, sådan at sandsynligheden for værdien 5 er den
 > samme som sandsynligheden for 28. Jeg har googlet lidt rundt, og har
 > fundet noget, der kan lave en symmetrisk normalfordeling her:
 > < http://www.taygeta.com/random/gaussian.html> Desværre er jeg så
 > rusten, så jeg ikke lige kan gennemskue hvordan jeg kan manipulere den
 > algoritme til at give mig et asymmetrisk resultat.
 Fordelingsfunktionen for en normalfordeling N(0,1) er givet ved Erf(x).
 1. generer et ligefordelt tilfældigt tal, x, i intervallet [0..1]
 2. find fordelingsfunktionens værdi for x, dvs X = F(x)
 3. anvend X som nøgle i Y = F(y), hvor Y er Erf(0,1)
 4. find y som inv(Erf(Y)) (oftest vha lookup og interpolation)
 5. korriger evt for mean og std med y = (y - mean)/std
 Tallet x er nu transformeret til et normalfordelt tal y.
 Asymmetrien i en normalfordelingsfunktion benævnes 'skewness', se
 < http://en.wikipedia.org/wiki/Skewness>,
< http://en.wikipedia.org/wiki/Skew_normal_distribution>, og
 < http://en.wikipedia.org/wiki/Inverse_transform_sampling>.
Du kan så indregne skewness ved at anvende en anden version af Erf(x)
 (i step 4), eller ved at foretage en anden korrektion (i step 5).
 --
 TA
            
              |   |   
            
        
 
            
         
           Edward Jensen (02-05-2009) 
         
	
            | Kommentar Fra : Edward Jensen | 
  Dato :  02-05-09 21:28 |  
  |   
            "Anders Wegge Keller" <wegge@wegge.dk> wrote in message 
 news:87vdojmxij.fsf@huddi.jernurt.dk...
 > Jeg har brug for en metode til at transformere et tilfældigt tal i
 > intervallet [0..1] til en værdi, der vil være normalfordelt med
 > maksimum omkring 9 til 10 med en spredning på ca 1.
 
 Maksimum? Mener du modus som i tilfældet med normalfordelingen er lig 
 middelværdien?
 
 > Derudover skal
 > fordelingen være skæv, sådan at sandsynligheden for værdien 5 er den
 > samme som sandsynligheden for 28.
 
 En normalfordeling er aldrig skæv. Den er symmetrisk omkring middelværdien.
 
 > Desværre er jeg så
 > rusten, så jeg ikke lige kan gennemskue hvordan jeg kan manipulere den
 > algoritme til at give mig et asymmetrisk resultat.
 
 Jeg ved stadigvæk ikke, hvad du mener med asymmetrisk. Hvis du mener en 
 normalfordelt sample med en middelværdi forskellig fra 0, er det ikke ret 
 svært. Genererer en standardiseret normalfordelt variabel med middelværdi 0 
 og varians 1 og læg 9 (eller 10 afhængig af hvad du mener) til.
 
 
 
  
            
             |   |   
            
        
 
            
         
           Anders Wegge Keller (02-05-2009) 
         
	
            | Kommentar Fra : Anders Wegge Keller | 
  Dato :  02-05-09 23:18 |  
  |   
            "Edward Jensen" <edward@jensen.invalid> writes:
 
 > "Anders Wegge Keller" <wegge@wegge.dk> wrote in message 
 > news:87vdojmxij.fsf@huddi.jernurt.dk...
 >> Jeg har brug for en metode til at transformere et tilfældigt tal i
 >> intervallet [0..1] til en værdi, der vil være normalfordelt med
 >> maksimum omkring 9 til 10 med en spredning på ca 1.
 
 > Maksimum? Mener du modus som i tilfældet med normalfordelingen er
 > lig middelværdien?
 
  Hvis det var en rigtig normalfordelingskurve jeg var ude efter, så
 ja. Men nu er jeg som sagt på jagt efter en assymetrisk kurve, der
 åbenbart hedder en skewed gaussian, efter hvad TA forklarer. Det jeg
 mener med maksimum er at jeg vil have et histogram hvor værdien 9 har
 den hyppigste forekomst.
 
 >> Derudover skal fordelingen være skæv, sådan at sandsynligheden for
 >> værdien 5 er den samme som sandsynligheden for 28.
 
 > En normalfordeling er aldrig skæv. Den er symmetrisk omkring
 > middelværdien.
 
  Ja, det er jeg blevet klar over. Det er så bare en anden ting jeg er
 på jagt efter.
 
 >> Desværre er jeg så rusten, så jeg ikke lige kan gennemskue hvordan
 >> jeg kan manipulere den algoritme til at give mig et asymmetrisk
 >> resultat.
 
 > Jeg ved stadigvæk ikke, hvad du mener med asymmetrisk. Hvis du mener
 > en normalfordelt sample med en middelværdi forskellig fra 0, er det
 > ikke ret svært. Genererer en standardiseret normalfordelt variabel
 > med middelværdi 0 og varians 1 og læg 9 (eller 10 afhængig af hvad
 > du mener) til.
 
  Tjahh ... Det er 17 år siden jeg havde Mat-alpha, så det med at
 generere en standardiseret normalfordelt variabel ryger hen over
 hovedet på mig. 
 
 -- 
 /Wegge
  
            
             |   |   
            
        
 
            
         
            Edward Jensen (03-05-2009) 
         
	
            | Kommentar Fra : Edward Jensen | 
  Dato :  03-05-09 01:44 |  
  |   
            "Anders Wegge Keller" <wegge@wegge.dk> wrote in message 
 news:87r5z7m9my.fsf@huddi.jernurt.dk...
 > "Edward Jensen" <edward@jensen.invalid> writes:
 >
 >> "Anders Wegge Keller" <wegge@wegge.dk> wrote in message
 >> news:87vdojmxij.fsf@huddi.jernurt.dk...
 >>> Jeg har brug for en metode til at transformere et tilfældigt tal i
 >>> intervallet [0..1] til en værdi, der vil være normalfordelt med
 >>> maksimum omkring 9 til 10 med en spredning på ca 1.
 >
 >> Maksimum? Mener du modus som i tilfældet med normalfordelingen er
 >> lig middelværdien?
 >
 > Hvis det var en rigtig normalfordelingskurve jeg var ude efter, så
 > ja. Men nu er jeg som sagt på jagt efter en assymetrisk kurve, der
 > åbenbart hedder en skewed gaussian, efter hvad TA forklarer.
 
 Okay. Jeg kender ikke noget til en skewed gaussian, og jeg kan umiddelbart 
 ikke forestille mig hvilke hendelser, man skulle ønske at modellere med en 
 sådan. I hvilken sammenhæng skal den bruges, og er du sikker på,. at det er 
 den rigtige fordeling? Måske hvis du fortalte lidt om, hvad det er, du 
 ønsker at modellere, kan vi bedre guide dig i en egnet fordelig.
 
 > Det jeg
 > mener med maksimum er at jeg vil have et histogram hvor værdien 9 har
 > den hyppigste forekomst.
 
 Altså modus.
 
 > Tjahh ... Det er 17 år siden jeg havde Mat-alpha, så det med at
 > generere en standardiseret normalfordelt variabel ryger hen over
 > hovedet på mig.
 
 Well... En standard metode består i, at man allerede er i stand til at 
 generere en sample fra en kontinuert uniform fordeling, kald den X, med 
 støtte [0;1]. Hvis du allerede kan det (der findes en hoben metoder til det 
 på nettet og i diverse API'er), er det en smal sag at transformere den til 
 en sample fra en arbitræt kontinuert fordeling, lad os kalde den Y, givet at 
 du kender fordelingsfunktionen, altså F(y) = P(Y <= y). Givet at F(y) er en 
 bijektiv funktion kan du finde dens invers, der er defineret på intervallet 
 [0;1] grundet Kolmogorov-aksiomerne. Hvis du har et analysisk udtryk for 
 F(y)^-1 og en kontinuert uniform fordelt sample mellem 0 og 1, kald den x, 
 kan du transformere x til at være en sample fra fordelingen Y ved at udregne 
 F(x)^-1.
 
 Hvis der ikke findes et udtryk for kvantilfunktionen, må du ty til monte 
 carlo algoritmer eller andre former for rejection metoder. Der findes tykke 
 bøger skrevet om den slags og universitetskuser alene omhandlende emnet, så 
 metoderne er omfangsrige.
 
 Jeg håber, at det er intuitivt; ellers må du sige til. 
 
 
  
            
             |   |   
            
        
 
            
         
           Anders Wegge Keller (03-05-2009) 
         
	
            | Kommentar Fra : Anders Wegge Keller | 
  Dato :  03-05-09 10:25 |  
  |   
            "Edward Jensen" <edward@jensen.invalid> writes:
 
 > "Anders Wegge Keller" <wegge@wegge.dk> wrote in message 
 
 >> Hvis det var en rigtig normalfordelingskurve jeg var ude efter, så
 >> ja. Men nu er jeg som sagt på jagt efter en assymetrisk kurve, der
 >> åbenbart hedder en skewed gaussian, efter hvad TA forklarer.
 
 > Okay. Jeg kender ikke noget til en skewed gaussian, og jeg kan
 > umiddelbart ikke forestille mig hvilke hendelser, man skulle ønske
 > at modellere med en sådan. I hvilken sammenhæng skal den bruges, og
 > er du sikker på,. at det er den rigtige fordeling? Måske hvis du
 > fortalte lidt om, hvad det er, du ønsker at modellere, kan vi bedre
 > guide dig i en egnet fordelig.
 
  Ja, det ville nok egentlig være på sin plads. Jeg sidder og brygger
 på noget software, der kan lave kakuro-opgaver. Det jeg skal bruge den
 skæve normalfordeling til er i første omgang at bestemme størrelsen af
 opgaven. Mindre end 5x5 er der ikke ret meget udfordring i, og bliver
 de større end 15x15, bliver det rimeligt tungt at regne på. Men jeg
 vil stadig gerne have at der indimellem kommer en af de store ud af
 det, så der bliver noget med ekstra udfordring i. 
 
  I dette tilfælde, ville jeg naturligvis kunne komme forholdsvist let
 ud af det, ved hjælp af tabelopslag. Men da jeg i forvejen pusler med
 at bruge genetisk søgning efter en række andre parametre, der tuner
 udseendet, ville det være smart, hvis jeg kunne få størrelsen med ind
 i den.
 
  ...
 
 > Jeg håber, at det er intuitivt; ellers må du sige til. 
 
  Jeg bliver nok nødt til at støve min Calculus af, inden jeg forstår
 det helt, men det ser ikke totalt tåget ud.
 
 -- 
 /Wegge
  
            
             |   |   
            
        
 
            
         
            TA (04-05-2009) 
         
	
            | Kommentar Fra : TA | 
  Dato :  04-05-09 17:52 |  
  |   
            "Anders Wegge Keller" <wegge@wegge.dk> wrote in message
 news:87ab5umtcj.fsf@huddi.jernurt.dk...
 >
 > <snip>
 >
 >  Ja, det ville nok egentlig være på sin plads. Jeg sidder og brygger
 > på noget software, der kan lave kakuro-opgaver. Det jeg skal bruge den
 > skæve normalfordeling til er i første omgang at bestemme størrelsen af
 > opgaven. Mindre end 5x5 er der ikke ret meget udfordring i, og bliver
 > de større end 15x15, bliver det rimeligt tungt at regne på. Men jeg
 > vil stadig gerne have at der indimellem kommer en af de store ud af
 > det, så der bliver noget med ekstra udfordring i.
 >
 >  I dette tilfælde, ville jeg naturligvis kunne komme forholdsvist let
 > ud af det, ved hjælp af tabelopslag. Men da jeg i forvejen pusler med
 > at bruge genetisk søgning efter en række andre parametre, der tuner
 > udseendet, ville det være smart, hvis jeg kunne få størrelsen med ind
 > i den.
 
 Du kan jo overveje at skræddersy en tæthedsfunktion (á et histogram),
 som opfylder dine krav. Du 'mapper' så dit ligefordelte tal til din
 skræddersyede fordeling via det kumulerede histogram.
 
 --
 TA
 
 
  
            
             |   |   
            
        
 
            
         
            Carsten Svaneborg (08-05-2009) 
         
	
            | Kommentar Fra : Carsten Svaneborg | 
  Dato :  08-05-09 14:21 |  
  |   
            Anders Wegge Keller wrote:
 >  Ja, det ville nok egentlig være på sin plads. Jeg sidder og brygger
 > på noget software, der kan lave kakuro-opgaver. Det jeg skal bruge den
 > skæve normalfordeling til er i første omgang at bestemme størrelsen af
 > opgaven. Mindre end 5x5 er der ikke ret meget udfordring i, og bliver
 > de større end 15x15, bliver det rimeligt tungt at regne på.
 
 Ahå. En normal fordeling er for reale tal P(x), du ønsker
 blot at generere tilfældige heltal der reproducerer et bestemt
 histogram.
 
 Lad os sige du har 4 udfald karakteriseret ved
 sandsyneligeheder Pa,Pb,Pc,Pd. Der gælder Pa+Pb+Pc+Pd = 1
 fordi de er sandsyneligheder.
 
 Vælg et tilfældigt tal x i intervallet mellem [0:1[ f.eks.
 med x=1.0*rand()/RAND_MAX  hvor rand() giver dig et heltal
 mellem 0 og RAND_MAX-1.
 
 Er 0 <= x < Pa           så udskriv a
 Er Pa <= x < Pa+Pb       så udskriv b
 Er Pa+Pb <= x < Pa+Pb+Pc så udskriv c
 Er Pa+Pb+Pc <= x < 1     så udskriv d
 
 Histogrammet for udfaldene a,b,c,d vil reproducerer det histogram
 du har defineret med sandsynelighederne.
 
 Det er trivielt at generaliserer til mange flere udfald.
 
 -- 
   Mvh. Carsten
  
            
             |   |   
            
        
 
            
         
           Anders Wegge Keller (02-05-2009) 
         
	
            | Kommentar Fra : Anders Wegge Keller | 
  Dato :  02-05-09 23:26 |  
  |  
 
            "TA" <not@active.invalid> writes:
 > "Anders Wegge Keller" <wegge@wegge.dk> wrote in message
 >>  Jeg har brug for en metode til at transformere et tilfældigt tal i
 >> intervallet [0..1] til en værdi, der vil være normalfordelt med
 >> maksimum omkring 9 til 10 med en spredning på ca 1. Derudover skal
 >> fordelingen være skæv, sådan at sandsynligheden for værdien 5 er den
 >> samme som sandsynligheden for 28. Jeg har googlet lidt rundt, og har
 >> fundet noget, der kan lave en symmetrisk normalfordeling her:
 >> < http://www.taygeta.com/random/gaussian.html> Desværre er jeg så
 >> rusten, så jeg ikke lige kan gennemskue hvordan jeg kan manipulere den
 >> algoritme til at give mig et asymmetrisk resultat.
 >
 > Fordelingsfunktionen for en normalfordeling N(0,1) er givet ved Erf(x).
 >
 > 1. generer et ligefordelt tilfældigt tal, x, i intervallet [0..1]
 >
 > 2. find fordelingsfunktionens værdi for x, dvs X = F(x)
 >
 > 3. anvend X som nøgle i Y = F(y), hvor Y er Erf(0,1)
 >
 > 4. find y som inv(Erf(Y)) (oftest vha lookup og interpolation)
 >
 > 5. korriger evt for mean og std med y = (y - mean)/std
 >
 > Tallet x er nu transformeret til et normalfordelt tal y.
  Jovel... Den matematik her ligger 17 år tilbage i tiden for mig, så
 jeg er reelt set totalt uvidende på området. Kæden hopper af allerede
 ved 2, så hvis jeg må være så fri, vil jeg gerne have skåret det lidt
 mere konkret ud.
 > Asymmetrien i en normalfordelingsfunktion benævnes 'skewness', se
 > < http://en.wikipedia.org/wiki/Skewness>,
> < http://en.wikipedia.org/wiki/Skew_normal_distribution>, og
 > < http://en.wikipedia.org/wiki/Inverse_transform_sampling>.
> Du kan så indregne skewness ved at anvende en anden version af Erf(x)
 > (i step 4), eller ved at foretage en anden korrektion (i step 5).
  Det ligner næsten noget jeg kan forstå, så jeg har ihvertfald noget
 at arbejde videre med. Jeg takker for referencerne.
 -- 
 /Wegge
            
              |   |   
            
        
 
            
         
           Torben Ægidius Mogen~ (04-05-2009) 
         
	
            | Kommentar Fra : Torben Ægidius Mogen~ | 
  Dato :  04-05-09 12:56 |  
  |  
 
            Anders Wegge Keller <wegge@wegge.dk> writes:
 >  Jeg har været for længe væk fra skolebænken til at jeg helt kan huske
 > hvordan det er det hænger sammen med normalfordelinger. Så bær over
 > med at jeg muligvis stiller et indlysende spørgsmål, eller tåger rundt
 > i begreberne.
 >
 >  Jeg har brug for en metode til at transformere et tilfældigt tal i
 > intervallet [0..1] til en værdi, der vil være normalfordelt med
 > maksimum omkring 9 til 10 med en spredning på ca 1. Derudover skal
 > fordelingen være skæv, sådan at sandsynligheden for værdien 5 er den
 > samme som sandsynligheden for 28. Jeg har googlet lidt rundt, og har
 > fundet noget, der kan lave en symmetrisk normalfordeling her:
 > < http://www.taygeta.com/random/gaussian.html> Desværre er jeg så
 > rusten, så jeg ikke lige kan gennemskue hvordan jeg kan manipulere den
 > algoritme til at give mig et asymmetrisk resultat. 
 Jeg kan forstå på dine senere kommentarer, at det ikke er vigtigt at
 du har en fordeling, der er præcis en skewed gaussian, men blot en
 fordeling, der "ligner".
 En simple metode til at få en tilnærmet gaussfordeling er, at lægge et
 antal lineært fordelte variabler sammen.  Allerede ved tre variabler
 er resultatet tilpas "klokkeformet" til de fleste anvendelser.  Det
 giver dog en symmetrisk fordeling.
 For at få en assymmetrisk fordeling, kan du finde N lineært fordelte
 tal og lægge de M største (eller mindste) af dem sammen.
 Hvis du for eksempel genererer 5 tal mellem 1 og 20 (begge inklusive)
 og lægger de to mindste af dem sammen, får du en fordeling, der ser
 således ud:
    Value   4.0 bars per %
       2 :  |||||||||
       3 :  ||||||||||||||||
       4 :  |||||||||||||||||||||
       5 :  |||||||||||||||||||||||||
       6 :  |||||||||||||||||||||||||||
       7 :  ||||||||||||||||||||||||||||
       8 :  |||||||||||||||||||||||||||||
       9 :  ||||||||||||||||||||||||||||
      10 :  |||||||||||||||||||||||||||
      11 :  |||||||||||||||||||||||||
      12 :  ||||||||||||||||||||||||
      13 :  |||||||||||||||||||||
      14 :  |||||||||||||||||||
      15 :  |||||||||||||||||
      16 :  |||||||||||||||
      17 :  |||||||||||||
      18 :  |||||||||||
      19 :  |||||||||
      20 :  ||||||||
      21 :  ||||||
      22 :  |||||
      23 :  ||||
      24 :  |||
      25 :  |||
      26 :  ||
      27 :  ||
      28 :  |
      29 :  |
      30 :  |
      31 :  
      32 :  
      33 :  
      34 :  
      35 :  
      36 :  
      37 :  
      38 :  
      39 :  
      40 :  
 Average = 11.02084375    Spread = 5.76626177979  Mean deviation = 4.62735148994
    Torben
 P.S.
 Grafen er lavet med Troll ( http://www.diku.dk/~torbenm/Troll), som kan
 beregne sandsynlighedsfordelinger for kombinationer af terninger af
 forskellig størrelse.  Den ovenstående fordeling er specificeret som
 "sum least 2 5d20", altså summen af de to mindste af 5 tyvesidede
 terninger.  Du kan downloade programmet og eksperimentere med
 forskellige kombinationer, indtil du finder noget, der giver en
 fordeling, du kan lide.
            
              |   |   
            
        
 
            
         
           Axel Hammerschmidt (04-05-2009) 
         
	
            | Kommentar Fra : Axel Hammerschmidt | 
  Dato :  04-05-09 13:36 |  
  |   
            Torben Ægidius Mogensen <torbenm@pc-003.diku.dk> wrote:
 
 <snip> 
 
 > Hvis du for eksempel genererer 5 tal mellem 1 og 20 (begge inklusive)
 > og lægger de to mindste af dem sammen, får du en fordeling...
 
 Og simuleringen ta'r jo 5 gange så lang tid.
 
 
 -- 
 "I believe in having an open mind, but not so open that your brains fall
  out." Grace Hopper.
  
            
             |   |   
            
        
 
            
         
            Torben Ægidius Mogen~ (05-05-2009) 
         
	
            | Kommentar Fra : Torben Ægidius Mogen~ | 
  Dato :  05-05-09 10:18 |  
  |   
            hlexa@hotmail.com (Axel Hammerschmidt) writes:
 
 > Torben Ægidius Mogensen <torbenm@pc-003.diku.dk> wrote:
 >
 > <snip> 
 >
 >> Hvis du for eksempel genererer 5 tal mellem 1 og 20 (begge inklusive)
 >> og lægger de to mindste af dem sammen, får du en fordeling...
 >
 > Og simuleringen ta'r jo 5 gange så lang tid.
 
 Det er ikke sikkert, at det er spor hurtigere at lave et enkelt
 lineært fordelt tal og så bruge en kompleks og dyr funktion bagefter
 for at få den ønskede fordeling.
 
 Desuden kan du sagtens lave fem ligeligt fordelte heltal mellem 1 og
 20 ud fra et enkelt lineært fordelt reelt tal mellem 0 og 1:
 
  x = prng();  /* 0 <= x < 1 */
  a = (int) (20.0*x);
  x = 20.0*x-(double)(a++);
  b = (int) (20.0*x);
  x = 20.0*x-(double)(b++);
  c = (int) (20.0*x);
  x = 20.0*x-(double)(c++);
  d = (int) (20.0*x);
  x = 20.0*x-(double)(d++);
  e = (int) (20.0*x);
 
 Så du kan betragte dette som en del af funktionen, der konverterer x
 til et skævt fordelt heltal.
 
    Torben
  
            
             |   |   
            
        
 
            
         
             Axel Hammerschmidt (06-05-2009) 
         
	
            | Kommentar Fra : Axel Hammerschmidt | 
  Dato :  06-05-09 15:24 |  
  |   
            Torben Ægidius Mogensen <torbenm@pc-003.diku.dk> wrote:
 
 > hlexa@hotmail.com (Axel Hammerschmidt) writes:
 
 <snip> 
 
 > > Og simuleringen ta'r jo 5 gange så lang tid.
 > 
 > Det er ikke sikkert, at det er spor hurtigere at lave et enkelt
 > lineært fordelt tal og så bruge en kompleks og dyr funktion bagefter
 > for at få den ønskede fordeling.
 > 
 > Desuden kan du sagtens lave fem ligeligt fordelte heltal mellem 1 og
 > 20 ud fra et enkelt lineært fordelt reelt tal mellem 0 og 1:
 > 
 >  x = prng();  /* 0 <= x < 1 */
 >  a = (int) (20.0*x);
 >  x = 20.0*x-(double)(a++);
 >  b = (int) (20.0*x);
 >  x = 20.0*x-(double)(b++);
 >  c = (int) (20.0*x);
 >  x = 20.0*x-(double)(c++);
 >  d = (int) (20.0*x);
 >  x = 20.0*x-(double)(d++);
 >  e = (int) (20.0*x);
 
 Hvordan har så'en bette PRNG rutine det med periodicitet?
 
 
 -- 
 "I believe in having an open mind, but not so open that your brains fall
  out." Grace Hopper.
  
            
             |   |   
            
        
 
            
         
           Henrik Christian Gro~ (06-05-2009) 
         
	
            | Kommentar Fra : Henrik Christian Gro~ | 
  Dato :  06-05-09 18:07 |  
  |   
            hlexa@hotmail.com (Axel Hammerschmidt) writes:
 
 > Torben Ægidius Mogensen <torbenm@pc-003.diku.dk> wrote:
 
 >> Desuden kan du sagtens lave fem ligeligt fordelte heltal mellem 1 og
 >> 20 ud fra et enkelt lineært fordelt reelt tal mellem 0 og 1:
 >> 
 >>  x = prng();  /* 0 <= x < 1 */
 >>  a = (int) (20.0*x);
 >>  x = 20.0*x-(double)(a++);
 >>  b = (int) (20.0*x);
 >>  x = 20.0*x-(double)(b++);
 >>  c = (int) (20.0*x);
 >>  x = 20.0*x-(double)(c++);
 >>  d = (int) (20.0*x);
 >>  x = 20.0*x-(double)(d++);
 >>  e = (int) (20.0*x);
 >
 > Hvordan har så'en bette PRNG rutine det med periodicitet?
 
 Det er ikke en PRNG-rutine Torben har skrevet der, han bruger faktisk
 ganske eksplicit en funktion der hedder prng.  Det Torbens kode gør er
 stort set at tage fem dele af "decimal"-fremstillingen og ophæve dem til
 at være fem forskellige tal (gåseøjne, fordi det er i 20-talssystemet,
 og "stort set" fordi han lægger 1 til hvert tal, for at få dem til at
 være mellem 1 og 20 i stedet for mellen 0 og 19).
 
 ..Henrik
 
 -- 
 .... applications which need to address vast amounts of memory
 (e.g., big scientific crankers, large databases, emacs) ...
                                                 -- fra en artikel i LWN
  
            
             |   |   
            
        
 
            
         
            Axel Hammerschmidt (06-05-2009) 
         
	
            | Kommentar Fra : Axel Hammerschmidt | 
  Dato :  06-05-09 22:49 |  
  |  
 
            Henrik Christian Grove <usenet@3001.dk> wrote:
 > hlexa@hotmail.com (Axel Hammerschmidt) writes:
 <snip> 
 > > Hvordan har så'en bette PRNG rutine det med periodicitet?
 > 
 > Det er ikke en PRNG-rutine Torben har skrevet der, han bruger faktisk
 > ganske eksplicit en funktion der hedder prng.
 http://en.wikipedia.org/wiki/Pseudorandom_number_generator
Forkortes PRNG eller prng.
 > Det Torbens kode gør er stort set at tage fem dele af
 > "decimal"-fremstillingen og ophæve dem til at være fem forskellige tal
 > (gåseøjne, fordi det er i 20-talssystemet, og "stort set" fordi han lægger
 > 1 til hvert tal, for at få dem til at være mellem 1 og 20 i stedet for
 > mellen 0 og 19).
 Det interessante spørgsmål var, hvor kort bliver periodiciteten?
 -- 
 "I believe in having an open mind, but not so open that your brains fall
  out." Grace Hopper.
            
              |   |   
            
        
 
            
         
             Martin Andersen (07-05-2009) 
         
	
            | Kommentar Fra : Martin Andersen | 
  Dato :  07-05-09 07:35 |  
  |  
 
            Axel Hammerschmidt wrote:
 > Henrik Christian Grove <usenet@3001.dk> wrote:
 > 
 >> hlexa@hotmail.com (Axel Hammerschmidt) writes:
 > 
 > <snip> 
 > 
 >>> Hvordan har så'en bette PRNG rutine det med periodicitet?
 >> Det er ikke en PRNG-rutine Torben har skrevet der, han bruger faktisk
 >> ganske eksplicit en funktion der hedder prng.
 > 
 >  http://en.wikipedia.org/wiki/Pseudorandom_number_generator
> 
 > Forkortes PRNG eller prng.
 > 
 Det tror jeg Henrik er klar over.
 >> Det Torbens kode gør er stort set at tage fem dele af
 >> "decimal"-fremstillingen og ophæve dem til at være fem forskellige tal
 >> (gåseøjne, fordi det er i 20-talssystemet, og "stort set" fordi han lægger
 >> 1 til hvert tal, for at få dem til at være mellem 1 og 20 i stedet for
 >> mellen 0 og 19).
 > 
 > Det interessante spørgsmål var, hvor kort bliver periodiciteten?
 > 
 PRNG funktionen er ikke defineret i af algoritmen hvorfor eventuelle 
 svagheder i implementationen ikke kan vurderes. Derfor Henriks forklaring.
            
              |   |   
            
        
 
            
         
              Axel Hammerschmidt (07-05-2009) 
         
	
            | Kommentar Fra : Axel Hammerschmidt | 
  Dato :  07-05-09 12:02 |  
  |   
            Martin Andersen <dur@ikke.nu> wrote:
 
 > Axel Hammerschmidt wrote:
 
 <snip> 
 
 > > Det interessante spørgsmål var, hvor kort bliver periodiciteten?
 > > 
 > PRNG funktionen er ikke defineret i af algoritmen hvorfor eventuelle 
 > svagheder i implementationen ikke kan vurderes. Derfor Henriks forklaring.
 
 Det var periodiciteten i denne "rutine" jeg efterlyste
 
 : Det Torbens kode gør er stort set at tage fem dele af
 : "decimal"-fremstillingen og ophæve dem til at være fem forskellige tal
 : (gåseøjne, fordi det er i 20-talssystemet, og "stort set" fordi han
 : lægger 1 til hvert tal, for at få dem til at være mellem 1 og 20 i
 : stedet for mellen 0 og 19).
 
 
 -- 
 "I believe in having an open mind, but not so open that your brains fall
  out." Grace Hopper.
  
            
             |   |   
            
        
 
            
         
               Martin Andersen (07-05-2009) 
         
	
            | Kommentar Fra : Martin Andersen | 
  Dato :  07-05-09 13:40 |  
  |   
            Axel Hammerschmidt wrote:
 > Martin Andersen <dur@ikke.nu> wrote:
 > 
 >> Axel Hammerschmidt wrote:
 > 
 > <snip> 
 > 
 >>> Det interessante spørgsmål var, hvor kort bliver periodiciteten?
 >>>
 >> PRNG funktionen er ikke defineret i af algoritmen hvorfor eventuelle 
 >> svagheder i implementationen ikke kan vurderes. Derfor Henriks forklaring.
 > 
 > Det var periodiciteten i denne "rutine" jeg efterlyste
 
 Der er ingen periodicitet i det du citerede, da "b" til "e" ikke bruger 
 dele af x's bit-repræsentation, som allerede er brugt til at finde 
 tidligere variablers værdi.
 
 Hvis nu der skulle findes 5 tal mellem 0 og 9 og x tilfældigvis blev 
 0,12345, så ville a være 1, b=2, c=3, d=4 og e=5. Hvis x var en hvilken 
 som helst anden streng ville a til e på samme måde blive fundet 
 uafhængigt af hinanden ud fra x's decimalrepræsentation. Der er altså 
 ingen periodicitet når der abstraheres fra eventuelle svagheder i 
 prng()-funktionen.
  
            
             |   |   
            
        
 
            
         
                Axel Hammerschmidt (07-05-2009) 
         
	
            | Kommentar Fra : Axel Hammerschmidt | 
  Dato :  07-05-09 13:43 |  
  |   
            Martin Andersen <dur@ikke.nu> wrote:
 
 > Axel Hammerschmidt wrote:
 > 
 > > Martin Andersen <dur@ikke.nu> wrote:
 > > 
 > >> Axel Hammerschmidt wrote:
 > > 
 > > <snip> 
 > > 
 > >>> Det interessante spørgsmål var, hvor kort bliver periodiciteten?
 > >>>
 > >> PRNG funktionen er ikke defineret i af algoritmen hvorfor eventuelle
 > >> svagheder i implementationen ikke kan vurderes. Derfor Henriks forklaring.
 > > 
 > > Det var periodiciteten i denne "rutine" jeg efterlyste
 > 
 > Der er ingen periodicitet i det du citerede, ...
 
 Jeg tror ikke vi kommer det nærmere.
 
 
 -- 
 "I believe in having an open mind, but not so open that your brains fall
  out." Grace Hopper.
  
            
             |   |   
            
        
 
            
         
           Anders Wegge Keller (07-05-2009) 
         
	
            | Kommentar Fra : Anders Wegge Keller | 
  Dato :  07-05-09 08:10 |  
  |  
 
            torbenm@pc-003.diku.dk (Torben Ægidius Mogensen) writes:
 > Anders Wegge Keller <wegge@wegge.dk> writes:
 > Jeg kan forstå på dine senere kommentarer, at det ikke er vigtigt at
 > du har en fordeling, der er præcis en skewed gaussian, men blot en
 > fordeling, der "ligner".
  Ja, det er korrekt.
 > En simple metode til at få en tilnærmet gaussfordeling er, at lægge
 > et antal lineært fordelte variabler sammen.  Allerede ved tre
 > variabler er resultatet tilpas "klokkeformet" til de fleste
 > anvendelser.  Det giver dog en symmetrisk fordeling.
 > For at få en assymmetrisk fordeling, kan du finde N lineært fordelte
 > tal og lægge de M største (eller mindste) af dem sammen.
 > Hvis du for eksempel genererer 5 tal mellem 1 og 20 (begge
 > inklusive) og lægger de to mindste af dem sammen, får du en
 > fordeling, der ser således ud:
  Og den er jo pænt tæt på at se ud som det jeg er ude
 efter. Umiddelbart tror jeg det er en nemmere forståeligt metode at
 benytte, fremfor at rode rundt med skewed gaussian.
 > Grafen er lavet med Troll ( http://www.diku.dk/~torbenm/Troll), som
 > kan beregne sandsynlighedsfordelinger for kombinationer af terninger
 > af forskellig størrelse.  Den ovenstående fordeling er specificeret
 > som "sum least 2 5d20", altså summen af de to mindste af 5
 > tyvesidede terninger.  Du kan downloade programmet og eksperimentere
 > med forskellige kombinationer, indtil du finder noget, der giver en
 > fordeling, du kan lide.
  Det lyder spændende, men hvad er det lige for et sprog den er skrevet
 i?
 -- 
 /Wegge
            
              |   |   
            
        
 
            
         
            Martin Larsen (07-05-2009) 
         
	
            | Kommentar Fra : Martin Larsen | 
  Dato :  07-05-09 10:25 |  
  |  
 
            "Anders Wegge Keller" <wegge@wegge.dk> skrev i meddelelsen 
 news:87ljp9gzi0.fsf@huddi.jernurt.dk...
 > torbenm@pc-003.diku.dk (Torben Ægidius Mogensen) writes:
 >
 >> Anders Wegge Keller <wegge@wegge.dk> writes:
 >
 >> Jeg kan forstå på dine senere kommentarer, at det ikke er vigtigt at
 >> du har en fordeling, der er præcis en skewed gaussian, men blot en
 >> fordeling, der "ligner".
 >
 > Ja, det er korrekt.
 >
 >> En simple metode til at få en tilnærmet gaussfordeling er, at lægge
 >> et antal lineært fordelte variabler sammen.  Allerede ved tre
 >> variabler er resultatet tilpas "klokkeformet" til de fleste
 >> anvendelser.  Det giver dog en symmetrisk fordeling.
 >
 >> For at få en assymmetrisk fordeling, kan du finde N lineært fordelte
 >> tal og lægge de M største (eller mindste) af dem sammen.
 >
 >> Hvis du for eksempel genererer 5 tal mellem 1 og 20 (begge
 >> inklusive) og lægger de to mindste af dem sammen, får du en
 >> fordeling, der ser således ud:
 >
 > Og den er jo pænt tæt på at se ud som det jeg er ude
 > efter. Umiddelbart tror jeg det er en nemmere forståeligt metode at
 > benytte, fremfor at rode rundt med skewed gaussian.
 >
 >> Grafen er lavet med Troll ( http://www.diku.dk/~torbenm/Troll), som
 >> kan beregne sandsynlighedsfordelinger for kombinationer af terninger
 >> af forskellig størrelse.  Den ovenstående fordeling er specificeret
 >> som "sum least 2 5d20", altså summen af de to mindste af 5
 >> tyvesidede terninger.  Du kan downloade programmet og eksperimentere
 >> med forskellige kombinationer, indtil du finder noget, der giver en
 >> fordeling, du kan lide.
 >
 > Det lyder spændende, men hvad er det lige for et sprog den er skrevet
 > i?
 >
 Det kan du finde i nævnte link   
Troll is implemented as an interpreter written in Standard ML (specifically, 
 Moscow ML)
 http://www.itu.dk/~sestoft/mosml.html
Mvh
 Martin
            
              |   |   
            
        
 
            
         
            Torben Ægidius Mogen~ (07-05-2009) 
         
	
            | Kommentar Fra : Torben Ægidius Mogen~ | 
  Dato :  07-05-09 16:48 |  
  |  
 
            Anders Wegge Keller <wegge@wegge.dk> writes:
 > torbenm@pc-003.diku.dk (Torben Ægidius Mogensen) writes:
 >
 >> Grafen er lavet med Troll ( http://www.diku.dk/~torbenm/Troll), som
 >> kan beregne sandsynlighedsfordelinger for kombinationer af terninger
 >> af forskellig størrelse.  Den ovenstående fordeling er specificeret
 >> som "sum least 2 5d20", altså summen af de to mindste af 5
 >> tyvesidede terninger.  Du kan downloade programmet og eksperimentere
 >> med forskellige kombinationer, indtil du finder noget, der giver en
 >> fordeling, du kan lide.
 >
 >  Det lyder spændende, men hvad er det lige for et sprog den er skrevet
 > i?
 Troll er skrevet i Standard ML (og bruger Moscow ML implementationen
 af Standard ML).  Troll er i sig selv et sprog, hvor sprogprimitiverne
 er operationer på terningeslag.  Troll kan bruges både til at lave
 tilfældige slag og til at beregne sandsynlighedsfordelinger.
    Torben
            
              |   |   
            
        
 
            
         
           N/A (04-05-2009) 
         
	
            | Kommentar Fra : N/A | 
  Dato :  04-05-09 17:52 |  
  |   
            
  
            
             |   |   
            
        
 
    
 
					
					 
			 | 
			
				
        
			 |