Club Delphi  
    Paypal   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

Coloboración Paypal con 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: 16
danielmj Va por buen camino
Hola,

Código Delphi [-]
procedure TForm1.Button1Click(Sender: TObject);
  var
    i: longint;
    Ristra : TAlea;
    n      : integer;

begin
{50.000
100.000
1000.000
100.000.000
150.000.000}

    lista.clear;
    randomize;
    case comb.ItemIndex of
    0: begin
        lista.clear;

        //barra.Max:= 50000;
        //barra.Position:= i;
        //label3.Caption:= 'Combinaciones generadas: '+IntToStr(i);

    {Sacamos 6 numero sin repetir}
      Ristra:=TAlea.Create(6);
      for n:= 1 to 6 do
        for i:= 0 to 100 do
          begin
          //memo1.Lines.Add( IntToStr(Ristra.PillaNumero) );
            with lista.Items.Add do
            begin
              subitems.Add(IntToStr(ristra.PillaNumero));
              subitems.Add(IntToStr(ristra.PillaNumero));
              subitems.Add(IntToStr(ristra.PillaNumero));
              subitems.Add(IntToStr(ristra.PillaNumero));
              subitems.Add(IntToStr(ristra.PillaNumero));
              subitems.Add(IntToStr(ristra.PillaNumero));
              Ristra.Free;
            end;
              {begin  //---> esto funciona pero son numeros repetidos.
              subItems.Add(IntToStr(randomRange(1,49)));
              subItems.Add(IntToStr(randomRange(1,49)));
              subItems.Add(IntToStr(randomRange(1,49)));
              subItems.Add(IntToStr(randomRange(1,49)));
              subItems.Add(IntToStr(randomRange(1,49)));
              subItems.Add(IntToStr(randomRange(1,49)));
              lista.Refresh;
//              end;
              button4.Enabled:= true;
              button3.Enabled:= true;
              end;}
         end;
    end;

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

Última edición por danielmj fecha: 19-10-2016 a las 19:12:02.
Responder Con Cita
  #2  
Antiguo 19-10-2016
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
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:

Código Delphi [-]
type
  TIntegerArray = array of Integer;

function RandomArray(AMin, AMax: Integer; ACount: Word): TIntegerArray;
var
  Found: Boolean;
  Max, N, I, J: Integer;

begin
  Max := AMax - AMin + 1;

  if ACount > Max then
    raise Exception.Create('There are more pigeons than holes');

  SetLength(Result, ACount);

  Result[0] := Random(Max) + AMin;

  for I := 1 to ACount - 1 do
  begin
    repeat
      Found := true;
      N := Random(Max) + AMin;

      for J := 0 to I - 1 do
        if (Result[J] = N) then
        begin
          Found := false;
          break;
        end;
    until Found;

    Result[i] := N;
  end;
end;

La función RandomArray te genera ACount números enteros en el rango AMin..AMax.

Lo puedes usar así:

Código Delphi [-]
var
  A: TIntegerArray;
  I, J: Integer;
  Item: TListItem;

begin
  ListView1.Clear;

  for I := 1 to 100 do
  begin
    A := RandomArray(1, 49, 6);
    Item := ListView1.Items.Add;
    Item.Caption := IntToStr(A[0]);

    for J := 2 to 5 do
      Item.SubItems.Add(IntToStr(A[J]));
  end;
end;

Edito:
No había visto el mensaje de Reasen. Ahora ya tienes dos opciones

LineComment Saludos

Última edición por roman fecha: 19-10-2016 a las 19:21:46.
Responder Con Cita
  #3  
Antiguo 19-10-2016
Avatar de danielmj
danielmj danielmj is offline
Miembro
 
Registrado: jun 2011
Posts: 383
Poder: 16
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
  #4  
Antiguo 19-10-2016
Avatar de mamcx
mamcx mamcx is offline
Moderador
 
Registrado: sep 2004
Ubicación: Medellín - Colombia
Posts: 3.941
Poder: 27
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
  #5  
Antiguo 19-10-2016
Avatar de danielmj
danielmj danielmj is offline
Miembro
 
Registrado: jun 2011
Posts: 383
Poder: 16
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
  #6  
Antiguo 20-10-2016
Avatar de Delphius
[Delphius] Delphius is offline
Miembro Premium
 
Registrado: jul 2004
Ubicación: Salta, Argentina
Posts: 5.582
Poder: 28
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
  #7  
Antiguo 20-10-2016
Avatar de Delphius
[Delphius] Delphius is offline
Miembro Premium
 
Registrado: jul 2004
Ubicación: Salta, Argentina
Posts: 5.582
Poder: 28
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
  #8  
Antiguo 20-10-2016
Avatar de mamcx
mamcx mamcx is offline
Moderador
 
Registrado: sep 2004
Ubicación: Medellín - Colombia
Posts: 3.941
Poder: 27
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
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
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:11:08.


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