Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   OOP (https://www.clubdelphi.com/foros/forumdisplay.php?f=5)
-   -   Generador de números aleatorios (https://www.clubdelphi.com/foros/showthread.php?t=22051)

gontxalo 05-06-2005 00:24:47

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.

Crandel 05-06-2005 01:26:32

con la función Random generas numeros aleatorios.

Pero no implica que no se repitan, son aleatorios!

roman 05-06-2005 04:43:53

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

Crandel 05-06-2005 06:14:23

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 :D

roman 05-06-2005 06:22:29

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 :p

elcigarra 06-06-2005 14:27:47

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.

gontxalo 06-06-2005 16:14:24

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.

maeyanes 06-06-2005 16:27:00

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.

Crandel 06-06-2005 18:03:00

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

Delphius 07-06-2005 06:36:34

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"

Crandel 07-06-2005 07:23:06

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 :D , pero se puso mas interesante :p

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 07-06-2005 08:17:21

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.

elcigarra 07-06-2005 14:42:25

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.

elcigarra 07-06-2005 14:44:13

Perdón... donde dije "esto no se obtiene con la función RandG..."
quise decir "esto SE obtiene con la función RandG..

gontxalo 09-06-2005 20:43:58

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

gontxalo 09-06-2005 21:25:12

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....

maeyanes 09-06-2005 21:38:07

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...


La franja horaria es GMT +2. Ahora son las 12:58:01.

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