PDA

Ver la Versión Completa : random siempre me da el mismo valor


sabueso1010
22-07-2011, 20:14:21
hola foro quiero tener un numero aleatorio para cambiar aleatoriamente el fondo de pantalla de mi proyecto, las imagenes de fondo tienen nombre numerico es decir 1.jpg, 2.jpg, 3.jpg, etc, el problema es que nunca cambia
siempre me da como resultado aleatorio el numero 1, alguien tiene idea de que este pasando ?

este es mi codigo

var
_fondo: string;
r: integer;
begin
r:=RandomRange(1,5);
_fondo:=inttostr(r)+'.jpg';
showmessage(_fondo);
fondo.Image.Picture.LoadFromFile(_fondo);

saludos

ecfisa
22-07-2011, 20:29:55
Hola sabueso1010.

Probá de este modo:

var
Fondo: string;
begin
Randomize;
Fondo:= IntToStr(Random(5)+1)+'.JPG'; // +1 si no deseas obtener el valor 0
ShowMessage(Fondo);
...
end;


Saludos.

sabueso1010
22-07-2011, 20:36:55
gracias ecfisa con tu codigo funciono perfectamente
de hecho ya lo habia intentado con algo parecido a tu codigo
pero me estaba faltando la sentencia RANDOMIZE, al parecer
el random no funciona si no aplicas antes un randomize, pero
con tu codigo ya funciona al 100%, gracias .

ecfisa
22-07-2011, 21:53:59
Hola sabueso1010.

Lo que sucede es que Random no genera números aleatorios sino pseudoaleatorios basados en una formula más o menos compleja que casi podríamos decir se asemeja a lo aleatorio.

La función Randomize inicializa el valor del generador en que se basará la fórmula para generar la secuencia con el reloj del sistema. Por lo que cada vez que se ejecute generará una serie diferente.

Si no inicializamos la 'semilla' o la inicializamos a un mismo valor, siempre obtenemos la misma secuencia.
Lo podes verificar con este símple código:

procedure TForm1.Button1Click(Sender: TObject);
var
i: Integer;
begin
RandSeed:= 15;
for i:= 1 to 10 do
ListBox1.Items.Add(IntToStr(Random(100)));
ListBox1.Items.Add('-----------------');
end;


Saludos.

Delphius
23-07-2011, 00:55:19
gracias ecfisa con tu codigo funciono perfectamente
de hecho ya lo habia intentado con algo parecido a tu codigo
pero me estaba faltando la sentencia RANDOMIZE, al parecer
el random no funciona si no aplicas antes un randomize, pero
con tu codigo ya funciona al 100%, gracias .

Hola sabueso1010,
La función Random() SI funciona, y de mil maravillas. El "defecto" es que lee, siempre, el mismo valor semilla con el cual genera el primer y los siguientes números pseudoaleatorios.
¿Poqué? Porque todo experimento o escenario de simulación debe tener como característica principal de poder repetirse a fin de comprobar y evaluar los resultados.

Para pruebas, y simulaciones es necesario poder recrear los mismos escenarios.

Cuando las pruebas finalizan y se da por válido el experimento; o para nuestro caso, en programación, para cuando el sistema sale de la etapa de desarrollo o mal llamado producción para ser comercializado es cuando entra en juego el procedimiento Randomize.

Randomize lo que hace es regenerar un nuevo valor semilla, por lo general se obtiene y se calcula en función de la fecha y hora del sistema. De este modo, al menos en teoría, nunca deberías obtener el mismo valor semilla.

Aquí hay que aclarar un punto muy importante: Sólo se debe invocar a Randomiza una sola vez en todo el programa; por lo general se estila y es conveniente hacerlo cuando se crea el form principal.

Hola sabueso1010.

Lo que sucede es que Random no genera números aleatorios sino pseudoaleatorios basados en una formula más o menos compleja que casi podríamos decir se asemeja a lo aleatorio.


Pues no se que le ves de complejo a un generador congruencial mixto:

Xiplus1 = ((Xi * A) + B) mod M

Siendo X0, léase X subíndice 0, el valor semilla y Xiplus1 el número i+1 a generar. El procedimiento se repite para Xi = Xiplus1.

El que posee un generador de la hostia es el programa Arena, que "básicamente" lo que hace es concatenar el resultado de N generadores:

X = Generador1 + Generador2 + ... + GeneradorN

Saludos,

ecfisa
23-07-2011, 02:19:36
Hola Delphius.

Pues no se que le ves de complejo a un generador congruencial mixto:

En particular, coincido con vos que los generadores ya séan lineales o múltiples no revisten una grán complejidad.

Pero como desconocía el grado de conocimiento sobre el tema de los posibles lectores y por tanto la dificultad que pudiera ofrecerles, me pareció que la apreciación "una formula mas o menos compleja" se ajustaba bién a cada caso.

Ampliando un poco para el interesado, algunos enlaces sobre el tema:

Método de Box-Muller (http://es.wikipedia.org/wiki/M%C3%A9todo_de_Box-Muller)
Método de la transformada inversa (http://es.wikipedia.org/wiki/M%C3%A9todo_de_la_transformada_inversa)
Generador de números aleatoros Hardware para PC (http://www.encomix.org/2007/11/13/generador-de-numeros-aleatorios-hardware-para-pc/)

Un saludo.