Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Principal > OOP
Registrarse FAQ Miembros Calendario Guía de estilo Temas de Hoy

Grupo de Teaming del ClubDelphi

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 05-06-2005
gontxalo gontxalo is offline
Miembro
 
Registrado: may 2005
Posts: 99
Poder: 19
gontxalo Va por buen camino
Generador de números aleatorios

Hola
Hace unas tres semans vi unos mensajes sobre generar en números aleatorios.
No los encuentro y me interesa el tema para una aplicación.

Como puedo generar en un form vcl, números aleatorios que no se repitan?

Si alguien se acuerda de donde puedo encontrar esos mensajes porfavor que me lo diga. Y si alguien sabe como poner un generador de números aleatorios sin repeticiones en un form vcl?

Gracias.
Responder Con Cita
  #2  
Antiguo 05-06-2005
Avatar de Crandel
[Crandel] Crandel is offline
Miembro Premium
 
Registrado: may 2003
Ubicación: Parana, Argentina
Posts: 1.475
Poder: 22
Crandel Va por buen camino
con la función Random generas numeros aleatorios.

Pero no implica que no se repitan, son aleatorios!
__________________
[Crandel]
Responder Con Cita
  #3  
Antiguo 05-06-2005
Avatar de roman
roman roman is offline
Moderador
 
Registrado: may 2003
Ubicación: Ciudad de México
Posts: 20.269
Poder: 10
roman Es un diamante en brutoroman Es un diamante en brutoroman Es un diamante en bruto
Cita:
Empezado por Crandel
Pero no implica que no se repitan, son aleatorios!
Lo que pasa es que no son taaaan aleatorios. Se debe usar Randomize cada vez para que no se repita la secuencia generada.

// Saludos
Responder Con Cita
  #4  
Antiguo 05-06-2005
Avatar de Crandel
[Crandel] Crandel is offline
Miembro Premium
 
Registrado: may 2003
Ubicación: Parana, Argentina
Posts: 1.475
Poder: 22
Crandel Va por buen camino
Talking

Cita:
Empezado por roman
Lo que pasa es que no son taaaan aleatorios. Se debe usar Randomize cada vez para que no se repita la secuencia generada.
No creo que el termino sea "no son tan aleatorios".

La función randon, es una función es que genera un números de acuerdo a un determinado algoritmo, que se basa en una distribución normal dentro dentro del intervalo que uno le especifique.

La función Randomize, lo que hace es inicializar la "semilla" generadora para que la función no comience generando siempre desde el mismo valor. Pero siguen siendo números de la misma secuencia, comenzando con valor diferente.

// Saludos
__________________
[Crandel]
Responder Con Cita
  #5  
Antiguo 05-06-2005
Avatar de roman
roman roman is offline
Moderador
 
Registrado: may 2003
Ubicación: Ciudad de México
Posts: 20.269
Poder: 10
roman Es un diamante en brutoroman Es un diamante en brutoroman Es un diamante en bruto
Cita:
Empezado por Crandel
Pero siguen siendo números de la misma secuencia, comenzando con valor diferente.
Tienes razón; corrijo:

Lo que pasa es que no son para nada aleatorios

// Saludos
Responder Con Cita
  #6  
Antiguo 06-06-2005
elcigarra elcigarra is offline
Miembro
 
Registrado: may 2005
Posts: 269
Poder: 19
elcigarra Va por buen camino
Podrías ir guardando los numeros emitidos en algún array generarlos en un bucle tipo While que solo salgan los que no se repitan... El tema es que estos que tu querés hacer son MENOS aleatorios todavía que los generados con el Random pelado. Corrijo a mi amigo crandel: No siempre tienen distribución normal, por lo menos en mi delphi 7 (si mal no recuerdo) hay funciones con algoritmos estadísticos para números aleatorios (o no tan aleatorios) con distribuciones de probabilidad tipo Poisson, "t", rectangulares y otras que a nosotros los pseudo científicos nos sirven de mucho.
Responder Con Cita
  #7  
Antiguo 06-06-2005
gontxalo gontxalo is offline
Miembro
 
Registrado: may 2005
Posts: 99
Poder: 19
gontxalo Va por buen camino
Se puede cambiar la semilla?

Y no se puede cambiar la semilla para que sea por ejemplo los minutos o segundos .... de cuando se ejecute la aplicación?
Gracias.
Responder Con Cita
  #8  
Antiguo 06-06-2005
[maeyanes] maeyanes is offline
Capo de los Capos
 
Registrado: may 2003
Ubicación: Campeche, México
Posts: 2.732
Poder: 23
maeyanes Va por buen camino
Eso es precisamente lo que hace el procedimiento Randomize

De la ayuda de delphi:
Cita:
Description

Randomize initializes the built-in random number generator with a random value (obtained from the system clock). The random number generator should be initialized by making a call to Randomize, or by assigning a value to RandSeed.
Responder Con Cita
  #9  
Antiguo 06-06-2005
Avatar de Crandel
[Crandel] Crandel is offline
Miembro Premium
 
Registrado: may 2003
Ubicación: Parana, Argentina
Posts: 1.475
Poder: 22
Crandel Va por buen camino
Cita:
Empezado por elcigarra
No siempre tienen distribución normal, por lo menos en mi delphi 7 (si mal no recuerdo) hay funciones con algoritmos estadísticos para números aleatorios (o no tan aleatorios) con distribuciones de probabilidad tipo Poisson, "t", rectangulares y otras que a nosotros los pseudo científicos nos sirven de mucho.
podrias comentar como cambiar la distribución de la función random, porque la verdad a mi me resultaria bastante util.

Gracias
__________________
[Crandel]
Responder Con Cita
  #10  
Antiguo 07-06-2005
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
Una sugerencia

personalmente para lograr nros "mas aletorios" realizo lo siguiente:
Código Delphi [-]
Randomize;
X = Random(Random(Dimension))+1;
Siendo Dimensión algún valor demasiado grande.
Espero que pueda serte útil.
Personalmente, esto de cambiar la distribución no se si se pueda... y me enteresa ya que tengo un simulador de tragamonedas que necesita ser más "real"
__________________
Delphius
[Guia de estilo][Buscar]

Última edición por Delphius fecha: 07-06-2005 a las 06:40:19. Razón: Correción en uso de etiquetas
Responder Con Cita
  #11  
Antiguo 07-06-2005
Avatar de Crandel
[Crandel] Crandel is offline
Miembro Premium
 
Registrado: may 2003
Ubicación: Parana, Argentina
Posts: 1.475
Poder: 22
Crandel Va por buen camino
Hola Delphius, tu función si modifica la distribución, si no me euquivoco de primera vista parece obtener una distribución exponencial decreciente, lo cual te puede general una gran predominancia de los numeros inferiores.

Esto es facilmente comprobable, simplemente podrias graficar un histograma con 1000 números generados.

Creo que nos fuimos totalmente de la pregunta de gontxalo , pero se puso mas interesante

Despues de escribir el mensaje anterior me acorde que hice un programa para la facultad donde genrabamos valores aleatorios con diferentes distribuciones. Voy a ver si lo encuentro (fue hace bastante) y lo escribo por aca.
__________________
[Crandel]
Responder Con Cita
  #12  
Antiguo 07-06-2005
Avatar de Crandel
[Crandel] Crandel is offline
Miembro Premium
 
Registrado: may 2003
Ubicación: Parana, Argentina
Posts: 1.475
Poder: 22
Crandel Va por buen camino
Aca encontre la forma en que generaba los número con diferentes distribuciones:

Uniforme
Código Delphi [-]
   dato := dstandard*Sqrt(12)*(random - 0.5) + vmedio;
Normal
Código Delphi [-]
   dato := dstandard*Sqrt(-2*ln(random))*cos(2*pi*random) + vmedio;

Exponencial
Código Delphi [-]
   dato := dstandard*ln(random)+(vmedio-dstandard);

donde dstandard es la distribución estandar y vmedio es el valor medio requerido.

Lo puede tomar al que le sirva.
__________________
[Crandel]
Responder Con Cita
  #13  
Antiguo 07-06-2005
elcigarra elcigarra is offline
Miembro
 
Registrado: may 2005
Posts: 269
Poder: 19
elcigarra Va por buen camino
Perdón, capaz que estoy equivocado, pero yendo a términos estadísticos una distribución normal de probabilidad referiría a numeros cuya probabilidad de salir aumenta al acercarse al valor medio en forma de campana (para describirlo en palabras simples). Esta sería la famosa campana de Gauss por lo que esta distribución se llama gaussiana. Si se graficaran los numeros aleatorios producidos de esta forma se vería que están más acumulados en el centro y hay unos pocos en los bordes del intervalo. Esto no se obtiene con la función "RandG" de la math unit de delphi. Esta función lleva como parámetros dicho valor medio y la "varianza" que va a dar en cierta forma lo "puntiagudo" de la distribución.

Con la función random no se obtiene esto, sinó números que están ordenados según una distribución de probabilidad "rectangular" (o plana) es decir que cualquier numero en el intervalo tiene la misma probabilidad de salir. Si se grafican éstos van a estar "uniformemente" esparcidos en el intervalo cuando la cantidad es muy grande.
Responder Con Cita
  #14  
Antiguo 07-06-2005
elcigarra elcigarra is offline
Miembro
 
Registrado: may 2005
Posts: 269
Poder: 19
elcigarra Va por buen camino
Perdón... donde dije "esto no se obtiene con la función RandG..."
quise decir "esto SE obtiene con la función RandG..
Responder Con Cita
  #15  
Antiguo 09-06-2005
gontxalo gontxalo is offline
Miembro
 
Registrado: may 2005
Posts: 99
Poder: 19
gontxalo Va por buen camino
conseguido

Hola
gracias
Ya me funciona, hasta ahora al ejecutar siempre se repetían las series, pero no sabía cambiar la semilla.
Ya se ejecuta y no se repiten, ni empiezan con la misma serie.

Gracias
Responder Con Cita
  #16  
Antiguo 09-06-2005
gontxalo gontxalo is offline
Miembro
 
Registrado: may 2005
Posts: 99
Poder: 19
gontxalo Va por buen camino
Randomize

Hola
Tengo ya un form que genera números aleatorios. Randomize. Según Maeyanes:

De la ayuda de delphi:
Citar:

Description

Randomize initializes the built-in random number generator with a random value (obtained from the system clock). The random number generator should be initialized by making a call to Randomize, or by assigning a value to RandSeed.

Randomiza la semilla del reloj.

Alguien sabe si la semilla que randomiza es respecto a segundos, centésimas, milésimas....
Responder Con Cita
  #17  
Antiguo 09-06-2005
[maeyanes] maeyanes is offline
Capo de los Capos
 
Registrado: may 2003
Ubicación: Campeche, México
Posts: 2.732
Poder: 23
maeyanes Va por buen camino
Según el código fuente del procedimiento Randomize, este primero trata de obtener el valor del contador de funcionamiento de alta resolución (high-resolution performance counter) con la función QueryPerformanceCounter del API y si falla, usa la función GetTickCount (también del API) la cual obtiene el número de milisegundos que han pasado desde que el sistema se encendió.

Ya con eso te darás una idea de como inicializa la semilla este procedimiento.


Saludos...
Responder Con Cita
Respuesta



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


La franja horaria es GMT +2. Ahora son las 21:25:40.


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