Ahora os quiero poner un ejemplo de un posible algoritmo generador de numeros aleatorios:
Supongamos que yo cojo como semilla los milisegundos del sistema. Imaginemos que los milisegundos son numeros de dos cifras para simplificar.
Tenemos lo siguiente:
Rand(x) donde x es la semilla (ms del sistema)
y tenemos esto:
Rand(1)=1
Rand(2)=1
Rand(3)=10
Rand(4)=2
Rand(5)=16
Rand(6)=3
Rand(7)=22
Rand(8 )=4
Rand(9)=28
Rand(10)=5
...
Rand(139)=388
Parece aleatorio verdad?
EL algoritmo ademas usa la primera semilla y no vuelve a usar nunca mas los milisegundos de forma que la siguiente semilla del generador es el resultado anterior.
Es decir, supongamos que los milisegundos empiezan en 69

:
Rand(69)=208
el siguientenumero a generar sera:
Rand(208)=104
Rand(104)=52
Rand(52)=26
Rand(26)=13
Rand(13)=40
y as sucesivamente.
La funcion rand, si os detuvierais lo suficiente para analizarla o directamente tuvierais su codigo, podriais adivinar que sigue la siguiente funcion:
Rand.hs (lenguaje haskell)
fRand :: Int -> Int
fRand 0 = 0
fRand 1 = 1
fRand x = if (even x) then (div x 2)
else (x*3+1)
Es decir, Rand(0)=0 y Rand(1)=1
Rand(Numero par)=(Numero par/2)
y Rand(Numero impar)=(Numero impar*3 +1)
Por lo que aunque parezca aleatorio, obteniendo la semilla incial o cualquier numero, podemos adivinar el siguiente y el anterior y asi sucesivamente.
Para colmo, el algoritmo es muy malo ya que converge al 1.
Es decir, cualquier numero como semilla va a generar una secuencia de numeros que acabara converigiendo al 1.
Podemos verlo con el siguiente codigo:
RandSec.hs (lenguaje haskell)
fSec :: Int -> [Int]
fSec 0 = []
fSec 1 = []
fSec x = fRand(x):fSec(fRand(x))
Ahora ejecuto el programa RandSec con una semilla cualquiera para obtener toda la lista de numeros que se irian generando hasta que el algorimo parase por llegar al 1. Recordad que la semilla incial son los milisegundos y la siguiente semilla es el resultado anterior:
Rand> fSec(17)
[52,26,13,40,20,10,5,16,8,4,2,1] :: [Int]
una semilla mas larga:
Rand> fSec (21924765)
[65774296,32887148,16443574,8221787,24665362,12332681,36998044,18499022,9249511,
27748534,13874267,41622802,20811401,62434204,31217102,15608551,46825654,23412827
,70238482,35119241,105357724,52678862,26339431,79018294,39509147,118527442,59263
721,177791164,88895582,44447791,133343374,66671687,200015062,100007531,300022594
,150011297,450033892,225016946,112508473,337525420,168762710,84381355,253144066,
126572033,379716100,189858050,94929025,284787076,142393538,71196769,213590308,10
6795154,53397577,160192732,80096366,40048183,120144550,60072275,180216826,901084
13,270325240,135162620,67581310,33790655,101371966,50685983,152057950,76028975,2
28086926,114043463,342130390,171065195,513195586,256597793,769793380,384896690,1
92448345,577345036,288672518,144336259,433008778,216504389,649513168,324756584,1
62378292,81189146,40594573,121783720,60891860,30445930,15222965,45668896,2283444
8,11417224,5708612,2854306,1427153,4281460,2140730,1070365,3211096,1605548,80277
4,401387,1204162,602081,1806244,903122,451561,1354684,677342,338671,1016014,5080
07,1524022,762011,2286034,1143017,3429052,1714526,857263,2571790,1285895,3857686
,1928843,5786530,2893265,8679796,4339898,2169949,6509848,3254924,1627462,813731,
2441194,1220597,3661792,1830896,915448,457724,228862,114431,343294,171647,514942
,257471,772414,386207,1158622,579311,1737934,868967,2606902,1303451,3910354,1955
177,5865532,2932766,1466383,4399150,2199575,6598726,3299363,9898090,4949045,1484
7136,7423568,3711784,1855892,927946,463973,1391920,695960,347980,173990,86995,26
0986,130493,391480,195740,97870,48935,146806,73403,220210,110105,330316,165158,8
2579,247738,123869,371608,185804,92902,46451,139354,69677,209032,104516,52258,26
129,78388,39194,19597,58792,29396,14698,7349,22048,11024,5512,2756,1378,689,2068
,1034,517,1552,776,388,194,97,292,146,73,220,110,55,166,83,250,125,376,188,94,47
,142,71,214,107,322,161,484,242,121,364,182,91,274,137,412,206,103,310,155,466,2
33,700,350,175,526,263,790,395,1186,593,1780,890,445,1336,668,334,167,502,251,75
4,377,1132,566,283,850,425,1276,638,319,958,479,1438,719,2158,1079,3238,1619,485
8,2429,7288,3644,1822,911,2734,1367,4102,2051,6154,3077,9232,4616,2308,1154,577,
1732,866,433,1300,650,325,976,488,244,122,61,184,92,46,23,70,35,106,53,160,80,40
,20,10,5,16,8,4,2,1] :: [Int]
mas ejemplos:
Rand> fSec(1027)
[3082,1541,4624,2312,1156,578,289,868,434,217,652,326,163,490,245,736,368,184,92
,46,23,70,35,106,53,160,80,40,20,10,5,16,8,4,2,1] :: [Int]
Rand> fSec(9027)
[27082,13541,40624,20312,10156,5078,2539,7618,3809,11428,5714,2857,8572,4286,214
3,6430,3215,9646,4823,14470,7235,21706,10853,32560,16280,8140,4070,2035,6106,305
3,9160,4580,2290,1145,3436,1718,859,2578,1289,3868,1934,967,2902,1451,4354,2177,
6532,3266,1633,4900,2450,1225,3676,1838,919,2758,1379,4138,2069,6208,3104,1552,7
76,388,194,97,292,146,73,220,110,55,166,83,250,125,376,188,94,47,142,71,214,107,
322,161,484,242,121,364,182,91,274,137,412,206,103,310,155,466,233,700,350,175,5
26,263,790,395,1186,593,1780,890,445,1336,668,334,167,502,251,754,377,1132,566,2
83,850,425,1276,638,319,958,479,1438,719,2158,1079,3238,1619,4858,2429,7288,3644
,1822,911,2734,1367,4102,2051,6154,3077,9232,4616,2308,1154,577,1732,866,433,130
0,650,325,976,488,244,122,61,184,92,46,23,70,35,106,53,160,80,40,20,10,5,16,8,4,
2,1] :: [Int]
No siempre el numero mas grande tiene la secuencia mas larga:
Rand> fSec(67108864)
[33554432,16777216,8388608,4194304,2097152,1048576,524288,262144,131072,65536,32
768,16384,8192,4096,2048,1024,512,256,128,64,32,16,8,4,2,1] :: [Int]
Por tanto, ademas, podemos ver que cualquier numero terminara cayendo en un punto de la secuencia anterior y a aprtir de ahi los siguientes elementos a generarse estan totalmente determinados. Es decir, una vez una semilla sea un numero de los anteriores y conocidos, la secuencia a generarse sera identica.
Por ejemplo para el caso de 9027, podemos ver que la secuencia termina en 650,325,976,488,244,122,61,184,92,46,23,70,35,106,53,160,80,40,20,10,5,16,8,4,
2,1
Si cojo como semilla cualquier numero de esa secuencia, por ejemplo el 325, la secuencia generada es exactamente la misma y corresponde a los elementos de la secuencia que le siguen:
Rand> fSec(325)
[976,488,244,122,61,184,92,46,23,70,35,106,53,160,80,40,20,10,5,16,8,4,2,1] :: [
Int]
Por ello, ese algoritmo es aparte de malo, no es nada aleatorio. No seria util para ninguna aplicacion que requiera de un generador decente.
Realmente esto es un caso extremo de como no hacer las cosas. Una mejora seria usar siempre los milisegundos del sistema, pero aun asi la aleatoriedad seria nula y estadisticamente se demustra al ver como la freceuncia de ciertos numeros es mayor que la de otros. Hay elementos que no pueden ser generados etc...
El caso es que por software, se puede hacer un generador rapido y mas potente que esta mierda y con cualidades estadisticas mas cercanas a la aleatoriedad. Pero al seguir un algoritmo, nunca el resultado sera completamente aleatorio.
Espero que os haya servido de algo, saludos. De todas formas, teneis en el numero 1 del CHU-flash un texto bastante decente que trata del tema y viene bastane mejor que en otros sitios como la wikipedia. Es parte de un informe que tuve que hacer para mi trabajo.
Un saludo