![]() |
numeros aleatoriios sin repetir
Hola (de nuevo), este problema se que es muy recurrente, pero no he conseguido (después de mirar mucho por la red y el foro), la forma de hacer trabajar mi programa. Lo ultimo ha sido usar un truco de la web de trucomania, pero aunque no da error de compilación, no funciona para nada bien una vez se ejecuta el codigo.
El código que se debe ejecutar es este:
Como puede verse, en el case, al seleccionar el item 0 del combobox, las combinaciones (de 6 numeros) llegan a 100, es decir, la lista (listview) debe tener 100 filas de 6 numeros no repetidos. La unidad que uso para realizar esto está aquí.. http://www.trucomania.org/trucomania/ftesp.html El problema es que en vez de rellenar la lista con esas 100 filas de numeros, solo hace un par (en el mejor de los casos). ¿Alguien sabe donde está el error? Captura de la aplicacion corriendo (aunque en la captura el combo tenga 50.000, en el codigo a modo de pruebas tiene un valor de 100) http://pasteall.org/pic/index.php?id=107843 Gracias. |
Pues así, a bote pronto, me parece que falta un begin inmediatamente abajo de
LineComment Saludos |
voy a probar, saludos
Edito: Ese begin no hace nada roman, lo he probado y sigue haciendo cosas raras. He grabado un pequeño video del problema, por si da mas pistas. https://youtu.be/2JDBzoq2jPY Un saludo y graacias. |
Y ademas falta su END. Pascal no es como python. La identacion es solo estetica.
Recomiendo que no uses WITH. Es uno de los keywords mas confusos del lenguajes y se debe evitar como la plaga. |
Hola, falta su END? si falta un END no deberia dar error de compilacion?
|
Cita:
Cita:
|
No entiendo al 100% tu problema pero te ayudaría usar una función más simple para generar números, te he creado una que te va a ahorrar usar 'IntToStr' en cada línea.
|
De hecho, también le falta su begin al bloque for. Lo del with es lo de menos.
LineComment Saludos |
hola roman, eso ya esta arreglado y sigue sin funcionar como deberia. Que la sintaxis no sea muy estetica tiene solución, pero el sacar 6 numeros del 1 al 49 en un for del 1 al 100 (por ejemplo) y que esos 6 numeros no se repitan es mas complicado que hacer la gran piramide! (esto ultimo es una prueba de que ya me tiene frustrado el dichoso programa).
Hola Reasen, pues basicamente lo que pretendo es eso de arriba, sacar 6 numeros aleatorios del 1 al 49 sin que se repitan y los vaya almacenando en un listview de 100 posiciones (o 50.000 estos valores son de ejemplo). Después de buscar y buscar informacion y gente con el mismo problema que yo en distintos foros, di con la web de trucomania y me ofrecia la posibilidad de usar una unidad que se encarga de todo pero como puedes ver, NO me funciona. Un saludo. |
Cita:
LineComment Saludos |
Hola,
Solo pongo el case 0 por que es el caso donde falla, una vez que este funcione el resto de case es copiar y pegar. Tal como está devuelve los 6 numeros y los mete en la primera posicion de la lista, pero tengo que estar pulsando el boton y entonces lo que hace es machacar los 6 numeros previos con otros nuevos ignorando el for de 1 a 100. saludos. |
Cita:
Veamos si esto te sirve: Añade una variable global || Acumulador: TStringList;
|
De entrada, el orden de los FOR parece estar alrevés: por cada una de las cien líneas debes hallar seis números. Y entonces faltaría crear esos seis números por cada línea (TAlea.Create sólo se llama una vez).
Mira este ejemplo, a ver si te vale:
La función RandomArray te genera ACount números enteros en el rango AMin..AMax. Lo puedes usar así:
Edito: No había visto el mensaje de Reasen. Ahora ya tienes dos opciones :) LineComment Saludos |
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 |
Cita:
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. |
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. |
Cita:
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:
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, |
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, |
Cita:
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:
Ahora, como realmente se debe explicar esto? |
Buenos dias roman,
He probado tu codigo en una aplicación a parte, y si funciona gracias. Saludos. |
La franja horaria es GMT +2. Ahora son las 10:38:10. |
Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi