Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

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

Grupo de Teaming del ClubDelphi

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 19-10-2016
Avatar de danielmj
danielmj danielmj is offline
Miembro
 
Registrado: jun 2011
Posts: 383
Poder: 14
danielmj Va por buen camino
Hola, de momento he cambiado el orden de los for y ahora me genera los 6 numeros durante 100 posiciones de la lista sin repetirlos, pero llega un momento en que solo genera numeros del 1 al 9 obviando el resto hasta el 49. ¿?

Sobre vuestros codigos, me pongo con ellos y os comento. En un rato entro a trabajar, no sé si me dará tiempo hoy.
Saludos y gracias.

http://pasteall.org/pic/index.php?id=107869
__________________
La juventud pasa, la inmadurez se supera, la ignorancia se cura con la educación, y la embriaguez con la sobriedad, pero la estupidez dura para siempre. Aristofanes.
Responder Con Cita
  #2  
Antiguo 19-10-2016
Avatar de mamcx
mamcx mamcx is offline
Moderador
 
Registrado: sep 2004
Ubicación: Medellín - Colombia
Posts: 3.918
Poder: 25
mamcx Tiene un aura espectacularmamcx Tiene un aura espectacularmamcx Tiene un aura espectacular
Cita:
Empezado por danielmj Ver Mensaje
pero llega un momento en que solo genera numeros del 1 al 9 obviando el resto hasta el 49. ¿?
Ten en cuenta que RANDOM *no signifca* que la distribucion es *uniforme*.

Es totalmente posible que una funcion random genere un millon de veces el *mismo* numero.

De hecho, una funcion random real se graficaria y daria que hay varios "clusters" alrededor de un grupo de numeros, sin que haya una distribucion perfecta de las posiblidades.

--
* Asumiendo que el codigo este bien hecho y no altere aun mas los resultados.
__________________
El malabarista.
Responder Con Cita
  #3  
Antiguo 19-10-2016
Avatar de danielmj
danielmj danielmj is offline
Miembro
 
Registrado: jun 2011
Posts: 383
Poder: 14
danielmj Va por buen camino
Hola mamcx,
No puedo poner código ahora, estoy con el móvil desde el curro, pero ya me funciona
He cambiado el orden de los for y la línea que dice creaste(6) creo recordar,
La he cambiado por creaste(49) y ya tiene más lógica.
Al millón de combinaciones no he llegado, he tenido que apagar la máquina antes
he llegado a 342 mil y pico, y esa es otra, necesito exprimir el listview para ver dónde
esta su límite. Si depende de la memoria del sistema no me preocupa
Pero si tiene alguna limitación en lo que es la programación del mismo control,
Entonces faltará y quiero saber cuándo para saber el número Marconi combinaciones
Que el listview puede almacenar en sus filas.
De todos modos, aún no la doy por terminada, ya me devuelve los 6 números que más se repiten
Pero ahora tengo que usar las combinaciones y las permutaciones de las matemáticas
Para mostrar esa combinación firmada por los seis números más repetidos de todas las formas posibles.
Que para ser 6, si no me equivoco, tiene 720 posibles formas de mostrar la misma combinación.
Así que aún queda.

Un saludo y por si acaso perdonar pero estoy escribiendo con el móvil.
__________________
La juventud pasa, la inmadurez se supera, la ignorancia se cura con la educación, y la embriaguez con la sobriedad, pero la estupidez dura para siempre. Aristofanes.
Responder Con Cita
  #4  
Antiguo 20-10-2016
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 mamcx Ver Mensaje
Ten en cuenta que RANDOM *no signifca* que la distribucion es *uniforme*.

Es totalmente posible que una funcion random genere un millon de veces el *mismo* numero.

De hecho, una funcion random real se graficaria y daria que hay varios "clusters" alrededor de un grupo de numeros, sin que haya una distribucion perfecta de las posiblidades.

--
* Asumiendo que el codigo este bien hecho y no altere aun mas los resultados.
FALSO.
Las funciones Random si son uniformes. Todas* tienen la misma probabilidad de salir: 1/m siendo m el período que tenga el generador.

*Todas las que se precien, y que están bien implementadas. Tenemos los clásicos generadores congruencial mixto y/o multiplicativo, como el gran generador MT19937N que es una implementación de Mersenne Twister; ampliamente probado y que está implementado como base en muchos lenguajes. Entre ellos: Lazarus. Delphi que yo sepa sigue usando un congruencial mixto.

Y digo que son uniformes porque fueron pensadas para generar números en el rango [0, 1)
Estas funciones random luego se deben volcar en la distribución que uno necesite para generar las Variables Aleatorias que pretende recrear o simular, calcular, etc. Por ejemplo, se puede usar una distribución normal, una uniforme, una exponencial, etc. Todas estas toman el valor R (random) y aplica el algoritmo de la función inversa acumulada F de dicha distribución. Por ejemplo para el caso de una distribución uniforme:

Código Delphi [-]
function Uniform(A, B: double): double;
var R: double;
begin
  R := random; // obtenemos un valor pseudo aleatorio en el rango [0,1)
  result := A + R * (B - A); // expresamos ahora R en la distribución para el rango [A,B]
end;

Y para la distribución normal es un poco más complicada, ya no la recuerdo muy bien... no me animo a poner un código realmente no vaya a ser cosa que le pifie. Recuerdo de un método relativamente rápido y lo suficiente preciso para la mayoría de las situaciones, e inspirado en la teoría del límite central.
Se calculaba la suma de 6 u 12 (no recuerdo bien) valores R, y luego se procedía a ¿multiplicar? por el valor de la desviación estándar pasado como parámetro. Era un algoritmo relativamente simple.

Como es de esperar, las variables aleatorias obtenidas con esta distribución seguirán la forma normal.

Y así, es para cada distribución que uno quiera.
En términos abstractos, matemáticamente tenemos VA = F(p1...pN, GEN);
Siendo VA la Variable Aletoria
F la función inversa para la distribución que uno requiera
p1 a pN los parámetros que requiere la distribución
GEN la función generadora de números pseudoaletorios [0,1)

Los repetidos que uno observa cuando hace uso de random en Delphi o en cualquier otro lenguaje se debe a que:

1. Está acotando el rango de secuencia a adoptar un valor mucho más chico. Por ejemplo, cuando "yo quiero números aletorios entre 1 y 50" random(50) lo que hará es traducir esos decimales infinitos a un rango finito. Este ejemplo es un tipico caso de una uniforme (A = 1, B = 50). Si en lugar de que el rango sea 50 sino un número mucho más grande.... 10^32 por ejemplo estos decimales entre 0 y 1 aportan mucho más riqueza y la probabilidad de encontrar repetidos disminuye.

2. O ha generado tantos números que se ha completado la secuencia de m-1 números distintos que es capaz de generar. Este m es un valor bastante grande. Un generador bien planteado, generará m-1 números distintos (insisto... si toma el valor R en 0..1 en su concepción infinita... recordemos que la aritemética de punto flotante tiene precisión finita) y empezará el nuevo ciclo (la misma secuencia) a partir del m-esimo número.

Mamx por favor evita pasar estas vergüenzas, no es bueno que tenga que estar corrigiendote seguido. Confundes al chico. A repasar se ha dicho... yo también que ya no recuerdo el algoritmo para la distribución normal.

Saludos,
__________________
Delphius
[Guia de estilo][Buscar]
Responder Con Cita
  #5  
Antiguo 20-10-2016
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
Recordaba que antes había expuesto los algoritmos (al menos de las 3 distribuciones más comunes). Guarden en caja fuerte, hagan backups, metan servidores espejos, etc.. a ese hilo.

Saludos,
__________________
Delphius
[Guia de estilo][Buscar]
Responder Con Cita
  #6  
Antiguo 20-10-2016
Avatar de mamcx
mamcx mamcx is offline
Moderador
 
Registrado: sep 2004
Ubicación: Medellín - Colombia
Posts: 3.918
Poder: 25
mamcx Tiene un aura espectacularmamcx Tiene un aura espectacularmamcx Tiene un aura espectacular
Cita:
Empezado por Delphius Ver Mensaje
Mamx por favor evita pasar estas vergüenzas, no es bueno que tenga que estar corrigiendote seguido. Confundes al chico.
Tienes razon Delphius. He re-chekeado el tema y lo que estaba intentando comunicar no estuvo bien.

He dado algunas vueltas a ver de donde saque tal idea, y creo que aqui hay un buen tema al respecto:

http://blog.blprnt.com/blog/blprnt/y...-visualization

Lo que se ve mas claro en las graficas es que los numeros aleatorios no siguen una progresion uniforme *estricta* tal como lo entenderia ingenuamente un ser humano. Sino que se pueden agrupar los resultados y ocurrir "brincos".

Que era lo que intentaba decir en respuesta a:

Cita:
pero llega un momento en que solo genera numeros del 1 al 9 obviando el resto hasta el 49. ¿?
Lo cual por si solo no es un problema.

Ahora, como realmente se debe explicar esto?
__________________
El malabarista.
Responder Con Cita
  #7  
Antiguo 20-10-2016
Avatar de danielmj
danielmj danielmj is offline
Miembro
 
Registrado: jun 2011
Posts: 383
Poder: 14
danielmj Va por buen camino
Buenos dias roman,

He probado tu codigo en una aplicación a parte, y si funciona gracias.
Saludos.
__________________
La juventud pasa, la inmadurez se supera, la ignorancia se cura con la educación, y la embriaguez con la sobriedad, pero la estupidez dura para siempre. Aristofanes.
Responder Con Cita
  #8  
Antiguo 20-10-2016
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 mamcx Ver Mensaje
Tienes razon Delphius. He re-chekeado el tema y lo que estaba intentando comunicar no estuvo bien.

He dado algunas vueltas a ver de donde saque tal idea, y creo que aqui hay un buen tema al respecto:

http://blog.blprnt.com/blog/blprnt/y...-visualization

Lo que se ve mas claro en las graficas es que los numeros aleatorios no siguen una progresion uniforme *estricta* tal como lo entenderia ingenuamente un ser humano. Sino que se pueden agrupar los resultados y ocurrir "brincos".

Que era lo que intentaba decir en respuesta a:



Lo cual por si solo no es un problema.

Ahora, como realmente se debe explicar esto?
Esos "brincos", "huecos", "espacios" o como se prefiera llamarles son inevitables en las distribuciones de números enteros. No es que el generador falle, sino que son simples errores de "redondeo" al expresar ese rango infinito en [0,1) hacia uno finito [A,B] o mejor dicho: [A,B).
A ver si me siguen la idea:

Queremos números en el rango [1,10) distribuídos uniformemente. Imaginemos a los números distribuídos en una regla:

0----------1----------2----------3----------4----------5----------6----------7----------8----------9----------10

Ahora debemos escalar/estirar la regla del rango [0,1) sobre esta:

0----------1----------2----------3----------4----------5----------6----------7----------8----------9----------10
0---------.1---------.2----------.3---------.4---------.5---------.6---------.7----------.8---------.9----------1.0

Podemos apreciar la razón o proporción entre ambas. De igual forma podemos inferir que hay una zona difusa ente 0.1 y 0.2. ¿Por ejemplo, que número debemos asumir si el valor R random es 0.15? Tenemos un hueco, y esto se debe a que para generar números enteros estamos "perdiendo esa precisión" hermosa que nos aportan los decimales. Hay infinitos valores R entre la VA = 1 y VA = 2. Pero estadísticamente la mitad de ellos van a traducirse a 1 y la otra mitad en 2. Cuando dos valores R son muy próximos entre si al "redondear" obviamente tendremos un VA repetido.

Imaginemos ahora que la regla para la VA es de [0,100)

0----------10----------20----------30----------40----------50----------60----------70----------80----------90----------10
0-----------.1----------.2-----------.3----------.4-----------.5----------.6-----------.7-----------.8----------.9-----------1.0

Un R entre 0.4 y 0.5 podrá producir 10 valores distintos de VA.

¿Y si repetimos el ejercicio con un rango [A,B) muchísimo más grande como 53454365462989021? ¡Perfecto! La magia del azar parece funcionar mucho mejor ¿que no?

En aquellas distribuciones de números reales, los efectos de huecos son menos vistos ya que aprovechan mejor los decimales. Los problemas y dificultades de entender la pseudo aleatoriedad está cuando uno necesita aplicar en distribuciones de números enteros. Son más prospensos a los repetidos.

No es difícil de entender.

Saludos,
__________________
Delphius
[Guia de estilo][Buscar]
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

Temas Similares
Tema Autor Foro Respuestas Último mensaje
No repetir lineas lbidi SQL 2 09-09-2014 02:19:54
Repetir una accion lmpadron C++ Builder 5 29-07-2010 20:21:31
Repetir valor altp SQL 7 27-06-2007 13:23:05
Es sano repetir? Johnny Q OOP 4 12-07-2005 21:09:51
no repetir campos ebeltete SQL 5 22-05-2003 04:32:53


La franja horaria es GMT +2. Ahora son las 19:39:26.


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