Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Principal > Varios
Registrarse FAQ Miembros Calendario Guía de estilo Buscar Temas de Hoy Marcar Foros Como Leídos

Grupo de Teaming del ClubDelphi

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 22-07-2011
sabueso1010 sabueso1010 is offline
Miembro
NULL
 
Registrado: jul 2011
Posts: 31
Poder: 0
sabueso1010 Va por buen camino
Cool random siempre me da el mismo valor

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

Código Delphi [-]
var
  _fondo: string;
  r: integer;
begin
  r:=RandomRange(1,5);
  _fondo:=inttostr(r)+'.jpg';
  showmessage(_fondo);
  fondo.Image.Picture.LoadFromFile(_fondo);

saludos
Responder Con Cita
  #2  
Antiguo 22-07-2011
Avatar de ecfisa
ecfisa ecfisa is offline
Moderador
 
Registrado: dic 2005
Ubicación: Tres Arroyos, Argentina
Posts: 10.508
Poder: 36
ecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to behold
Hola sabueso1010.

Probá de este modo:
Código Delphi [-]
var
  Fondo: string;
begin
  Randomize;
  Fondo:= IntToStr(Random(5)+1)+'.JPG'; // +1 si no deseas obtener el valor 0
  ShowMessage(Fondo);
  ...
end;

Saludos.
__________________
Daniel Didriksen

Guía de estilo - Uso de las etiquetas - La otra guía de estilo ....
Responder Con Cita
  #3  
Antiguo 22-07-2011
sabueso1010 sabueso1010 is offline
Miembro
NULL
 
Registrado: jul 2011
Posts: 31
Poder: 0
sabueso1010 Va por buen camino
Thumbs up solucionado

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 .
Responder Con Cita
  #4  
Antiguo 22-07-2011
Avatar de ecfisa
ecfisa ecfisa is offline
Moderador
 
Registrado: dic 2005
Ubicación: Tres Arroyos, Argentina
Posts: 10.508
Poder: 36
ecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to behold
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:
Código Delphi [-]
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.
__________________
Daniel Didriksen

Guía de estilo - Uso de las etiquetas - La otra guía de estilo ....
Responder Con Cita
  #5  
Antiguo 23-07-2011
Avatar de Delphius
[Delphius] Delphius is offline
Miembro Premium
 
Registrado: jul 2004
Ubicación: Salta, Argentina
Posts: 5.582
Poder: 25
Delphius Va camino a la fama
Cita:
Empezado por sabueso1010 Ver Mensaje
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.

Cita:
Empezado por ecfisa Ver Mensaje
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:

Código Delphi [-]
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,
__________________
Delphius
[Guia de estilo][Buscar]
Responder Con Cita
  #6  
Antiguo 23-07-2011
Avatar de ecfisa
ecfisa ecfisa is offline
Moderador
 
Registrado: dic 2005
Ubicación: Tres Arroyos, Argentina
Posts: 10.508
Poder: 36
ecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to behold
Hola Delphius.
Cita:
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
Método de la transformada inversa
Generador de números aleatoros Hardware para PC

Un saludo.
__________________
Daniel Didriksen

Guía de estilo - Uso de las etiquetas - La otra guía de estilo ....
Responder Con Cita
Respuesta


Herramientas Buscar en Tema
Buscar en Tema:

Búsqueda Avanzada
Desplegado

Normas de Publicación
no Puedes crear nuevos temas
no Puedes responder a temas
no Puedes adjuntar archivos
no Puedes editar tus mensajes

El código vB está habilitado
Las caritas están habilitado
Código [IMG] está habilitado
Código HTML está deshabilitado
Saltar a Foro

Temas Similares
Tema Autor Foro Respuestas Último mensaje
Firebird, No siempre utiliza el mismo PLAN? Kipow SQL 12 03-12-2015 17:35:22
Problemas con Rave Report, siempre el mismo Paulao Varios 0 09-03-2011 16:38:32
Foco siempre en el mismo tedit Viky Varios 2 14-06-2010 19:37:06
¿Como sumar un valor de un edit y reflejar incremento en el mismo? The_Animal Varios 3 31-12-2007 02:12:48
Select Max siempre devuelve valor FernanGil Conexión con bases de datos 3 06-10-2003 16:55:36


La franja horaria es GMT +2. Ahora son las 20:11:34.


Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi
Copyright 1996-2007 Club Delphi