Duda acerca de la aleatoriedad

Es una cuestión que me he planteado esta tarde. Debido a mi desconocimiento de la materia no sé si será una obviedad, o ya se ha respondidom, o no es el subforo adecuado o donde podría buscar infomación. Simplemente se trata de saciar mi curiosidad.

El caso es que me la planteé cuando me dí cuenta de que los reproductores de música, al pedirles una reproducción en "aleatorio" suelen repetir mucho las canciones reproducidas.

Al principio pensé que sería cosa de programación. Quizá se calculaba mediante un algoritmo y en reproductores baratos es de esperar que no esté tan trabajado. Pero llevo unos meses con el ipod touch y creo que el problema se repite. Aun teniendo muchas canciones donde elegir, la máquina tiende a elegir ciertas canciones mas que otras.

Y eso me llevó a preguntarme, cómo establece una máquina/sistema/lo que sea, un resultado aleatorio? Qué proceso sigue para ofrecer ese resultado? Es absolutamente aleatorio o puede estar condicionado por alguna variable?

Perdonad mi desconocimiento del campo, pero para eso pregunto :P
Agradecería una respuesta razonada. [bye]
pues en la reproducción de mp3 ni idea de como funciona, pero programando cuando usas random, teóricamente genera un numero aleatorio.
Esto no es así ya que todas las veces que lanzas el programa te genera la misma serie de números.
quizá tenga algo que ver.
yo se que el Aleatorio como tal en la computacion no existe, lo que pasa con el random agarra creo una millonesima de segundo o algo asi
que es muy improbable de predecir.
Yo sospecho que elige canciones aleatorias pero que no estén demasiado distantes entre sí en el disco para ahorrar baterías... Al menos mi Zen suele hacer eso... También es posible que tengan más probabilidades de ser elegidas las canciones más escuchadas, pero no sé...
Gracias por las respuestas. Sin embargo la duda va más allá, aunque quizá sea un proceso diferente. De todos modos ¿que hace exactamente una máquina cuando le pides un número aleatorio entre 1y 10? o en un nivel más bajo, ¿Cómo elige aleatoriamente entre un uno y un cero?
Hay formas matemáticas de obtener números pseudo-aleatorios, esto es, que no son aleatorios en realidad. En general, eligen un número (llamado seed/semilla) y un N, con los que se realizan operaciones para dar un pseudoaleatorio. Se pueden operar múltiples veces para obtener cada vez un aleatorio distinto, hasta N veces, momento en el que se repetirá el primer número, por lo que se intenta que N sea lo mayor posible. Para ello hay varios algoritmos y ahora mismo no recuerdo ninguno, miraría los apuntes pero están "muy escondidos en el cajón".

Por ejemplo en C tienes la función rand(), que dará un número distinto cada vez que se ejecute en el mismo programa. Para que la semilla sea más o menos aleatoria, se inicializa con algún valor relacionado con el tiempo del sistema, por ejemplo con srand(time(NULL));. El programa siguiente dará valores distintos si se ejecuta en segundos distintos, pero si lo ejecutas varias veces en el mismo segundo dará el mismo número.
#include <stdio.h>
#include <time.h>

main(){
   int r;

   srand(time(NULL));
   r = rand();
   printf("%i\n", r);
}


El resultado de ejecutarlo 3 veces en mi ordenador, 2 en el mismo segundo y la 3ª un poco después:
samuel@linux:/tmp 15:09:44 $ ./a.out
2032613962
samuel@linux:/tmp 15:09:44 $ ./a.out
2032613962
samuel@linux:/tmp 15:09:46 $ ./a.out
46611799


Para elegir un número entre A y B pues habrá algoritmos para elegir un número entre A y B, otros para elegir entre 0 y B-A y luego se le suma A, o generar aleatorios hasta que esté dentro de los límites.

En fin, no sé qué algoritmo será el más usado ni cuál implementa el rand() de C. Ya te digo que esto lo dí hace años y casi no me acuerdo.

Seguramente haya métodos más complejos y eficaces, y alguien te los podrá explicar bastante mejor que yo :P No creo que sea muy difícil encontrar información de esto en cualquier buscador.

Saludos
Gracias paisano!
Me lo has dejado bastante claro y me has dado materia para buscar.
De todas maneras hay modos random para reproductores de musica que su resultado realmente bueno. Este es un caso:

Se usan dos listas una de reproduccion y otra de historia.
Se elige una canción al azar y si cumple las siguientes condiciones seleccionables se reproduce y se pone en historia:
ninguna canción se puede repetir si entre repeticiones han pasado menos de 30 minutos.
ninguna canciones se puede repetir mas de 5 veces en 4 horas
Elohe escribió:De todas maneras hay modos random para reproductores de musica que su resultado realmente bueno. Este es un caso:

Se usan dos listas una de reproduccion y otra de historia.
Se elige una canción al azar y si cumple las siguientes condiciones seleccionables se reproduce y se pone en historia:
ninguna canción se puede repetir si entre repeticiones han pasado menos de 30 minutos.
ninguna canciones se puede repetir mas de 5 veces en 4 horas


Claro, pero entonces ya no es aleatorio, lo estás sesgando (a tu favor, claro XD). Quiero decir, si es aleatorio y suponemos sucesos independientes, por ejemplo para resultados posibles de 0 a 9, si lo ejecutas una vez y sale 5, la siguiente ejecución es independiente de la anterior, por lo que la probabilidad (ideal si es aleatorio, no pseudo-aleatorio) de que salga 5 en la siguiente es 1/10.

Si implementas la lista de historia, estás sesgando esta probabilidad, de modo que en el segundo caso la probabilidad de que salga 5 es 0, y la probabilidad del resto de números es 1/9. No hay que confundir esto con la probabilidad de que salga la secuencia 5,5; que sería 1/100 en el caso ideal sin lista histórica.

Aunque digamos desde el punto de vista de quien escucha la música, sí es un buen comportamiento, porque a nadie le gusta escuchar la misma canción dos veces seguidas.

Como curiosidad, como te han comentado, computacionalmente es un problema que no es trivial el tema de la generación de números aleatorios de verdad (no pseudo-aleatorios). Una forma práctica de hacerlo es usar el ruido térmico de un dispositivo electrónico, aunque hay otros.
Si es aleatorio de verdad, no veo por qué no se podrían repetir canciones. A fin de cuentas cada sucesos (elegir una canción) es equiprobable, así que tienes la misma probabilidad de elegir la misma canción 5 veces que 5 canciones distintas.


También hay que tener en cuenta que a veces en programación la aleatoriedad se implementa "mal".

Ejemplo, tenemos 5 canciones, y para elegir una hacemos

(rand() % 5 )
para elegir un número entre 0 y 4 ( 5 números distintos en total)

El problema de implementarlo así, es que hay números que tienen más probabilidad de salir que otros.
Por ejemplo, si rand() devuelve un número pseudo-aleatorio entre 1 y 10, efectivamente todos los números tienen la misma posibilidad de salir:

1%5=1
2%5=2
3%5=3
4%5=4
5%5=0
6%5=1
7%5=2
8%5=3
9%5=4
10%5=0

Pero si rand() devuelve un número que no sea múltiplo de 5, la cosa cambia:

1%5=1
2%5=2
3%5=3
4%5=4
5%5=0
6%5=1
7%5=2
8%5=3
9%5=4
10%5=0
11%5=1
12%5=2

Ahora el número 1 y el número 2 tienen más probabilidad de ser elegidos.


Puede que los tiros vayan por ahí.
Det_W.Somerset, por supuesto que así no es realmente aleatorio. Pero así se solucionan problemas de los generadores aleatorios que presentan una mala entropia, muchos sistemas de generación pseudoaleatoria son mejorables con técnicas así.

Un caso claro es el mio, en una carpeta 2000 canciones de música y resulta que el 90% del tiempo se reproducían solo el 10% de las canciones, al aplicar reglas como las anteriores también se reproducían el mismo 10% de las canciones pero esta vez solo lo hacían en el 25% del tiempo.

Muchas veces se tiende a pensar en funciones aleatorias ideales, la cuestión es que muchas veces es mejor pensar en la aproximación a la función aleatoria que conviene. Hay situaciones como en seguridad que conviene una aproximación al ideal y otras como en listas de reproducción que lo mas importante es la sensación de aleatoriedad que la aleatoriedad real.

PD. En probabilidad podemos hablar de dos tipos.

El primero es que todos los objetos a seleccionar están siempre entre los seleccionables (ej. una ruleta).

El segundo cuando los elementos a seleccionar son extraídos de los seleccionables una vez seleccionados (ej. la primitiva).

En el primer caso se obtienen objetos de forma aleatoria y en el segundo una lista aleatoria de objetos. Lo que as llamado lista sesgada seria un caso que se movería entre ambos tipos
10 respuestas