1votos

Tabla de galton en Haskell

por josejuan hace 5 años

Curiosa máquina, lógicamente puede obtenerse de forma inmediata la distribución de probabilidad (en concreto la función de densidad) porque el experimento (supuesto el efecto físico reparte equitativamente en cada "pivote") corresponde con la distribución binomial y, el peso (densidad) en cada columna, corresponde con la fila n-ésima del triángulo de pascal (que se puede calcular de forma explícita en la fila n-ésima). No se si es hacer trampa :D pero es como hacer RAND infinitas veces :D

simular una maquina de galton

1
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
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
-- Aplicando http://en.wikipedia.org/wiki/Pascal%27s_triangle#Calculating_a_row_or_diagonal_by_itself 
pascalRow n = foldl a [1] [0..n - 1] 
              where a css@(c:cs) k = (c * (n - k)) `div` (k + 1): css 
 
-- Obtiene el valor esperado del número de bolas para ese número de columnas (incluidas las que se caen ;P XD XD) 
galtonMachine balls cols = map (\n -> (n * balls) `div` sp) ps 
                           where ps = pascalRow cols 
                                 sp = sum ps 
 
 
 
 
 
 
 
 
 
 
 
 
{- 
-- Por ejemplo, si lanzamos 10.000.000.000.000.000 bolas (no se hace "nada" con ese nº, por eso puede ser tan grande) 
-- en una máquina Galton con 50 columnas finales, caeran maaaaaaaas o menos éstas bolas por columna 
444 
10880 
174082 
2045474 
18818369 
141137768 
887151685 
4768440309 
22252721443 
91236157917 
331767846972 
1078245502661 
3151794546241 
8329742729351 
19991382550443 
43731149329095 
87462298658191 
160347547540018 
270059027435820 
418591492525521 
597987846465031 
788256706703904 
959616860335188 
1079568967877087 
1122751726592170 
1079568967877087 
959616860335188 
788256706703904 
597987846465031 
418591492525521 
270059027435820 
160347547540018 
87462298658191 
43731149329095 
19991382550443 
8329742729351 
3151794546241 
1078245502661 
331767846972 
91236157917 
22252721443 
4768440309 
887151685 
141137768 
18818369 
2045474 
174082 
10880 
444 
-} 
2 comentarios
0votos

Escrito por carlosjm4 hace 5 años

Gracias, por rsponder al desafio. Realmente no entiendo ni poco de haskell, en realidad estoy intentando aprender a programasr. :DD. pero puedo ver por la salida que el programa hace lo que se pide
0votos

Escrito por josejuan hace 5 años

@carlosjm4, la tabla de galton puede verse de muchas formas, en la forma en la que el propio galton la estudió
          :
          :
          A
        B   C
      D   E   F
    :   :   :   :
    :   :   :   :
    :   :   :   :
    :   :   :   :
    :   :   :   :
    1   2   3   4

cuando una bola cae sobre A, puede ir a la izq. o la der. con igual probabilidad ( P{izq}=1/2 y P{der}=1/2 ).

Así, en este ejemplo que tiene 3 filas, el suceso que una bola caiga en cualquiera de las columnas tiene probabilidad 1/2 * 1/2 * 1/2 = 1/2^3.

También puede verse como el nº de caminos que nos lleva de la línea punteada en que caen las bolas a cada columna 1..4 puesto que para llevar la columna 1 sólo hay el camino ABD, para llegar a la columna 2 tenemos ABE y ACE, etc...

Ésta segunda forma creo que es la más fácil de ver para conectar el problema con el triángulo de Pascal, puesto que el número de caminos posibles son precisamente los valores en la fila n-ésima (en este caso la 3ª) del triángulo de Pascal.

También, la distribución binomial se llama así porque las probabilidades corresponden con los coeficientes binomiales y éstos, son precisamente los valores de la fila n-ésima del triángulo de Pascal.

Así, aunque el código está en Haskell, puede vislumbrarse que la función pascalRow calcula los valores de la fila n-ésima del triángulo de Pascal y que la función galtonMachine símplemente pondera dichos valores por el número de bolas indicada (mediante (valor * NúmeroBolas) / SumaValores ).

En la época de Galton, calcular los coeficientes binomiales y operar sobre ellos para valores grandes era complicado, por eso se le ocurrió esta ingeniosa máquina (en la hipótesis de P{izq/der}=1/2 en cada pivote) para "visualizar" cómo la distribución binomial es una gaussiana (distribución normal) para valores grandes de n (aunque en mi opinión, el hecho de usar una máquina física en la que hay procesos estocásticos invalida la hipótesis inicial, puesto que hoy sabemos, que la combinación de varias variables aleatorias de cualquier tipo de distribución "suele" resultar en una normal).

Por cierto, antes de este problema, no recuerdo haber conocido esta curiosa máquina ¡gracias!.

"en realidad estoy intentando aprender a programasr"

Pues si estás empezando, no se te da mal :)
Como sugerencia, te animaría a no darle demasiada importancia ni al lenguaje de programación ni a las estructuras, sino a entender el problema y pensar sobre él; pensado sobre él, entenderás y asimilarás mejor (siempre en mi opinión) las propias características de cada lenguaje y sus estructuras.

¡Ánimo!

Comenta la solución

Tienes que identificarte para poder publicar tu comentario.