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 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 hecho, también le falta su begin al bloque for. Lo del with es lo de menos.

LineComment Saludos
Responder Con Cita
  #2  
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 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.
__________________
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
  #3  
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
Cita:
Empezado por danielmj Ver Mensaje
hola roman, eso ya esta arreglado y sigue sin funcionar como deberia.
Entonces ¿por qué no pones aquí el código arreglado para que partamos de ahí?

LineComment Saludos
Responder Con Cita
  #4  
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,

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
  #5  
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
  #6  
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
  #7  
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
  #8  
Antiguo 19-10-2016
Reasen Reasen is offline
Miembro
NULL
 
Registrado: dic 2015
Ubicación: Barcelona
Posts: 140
Poder: 9
Reasen Va por buen camino
Cita:
Empezado por danielmj Ver Mensaje
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.

Veamos si esto te sirve:

Añade una variable global || Acumulador: TStringList;

Código Delphi [-]
function RandomRange(const AFrom, ATo: Integer): Integer;
begin
  if AFrom > ATo then
    Result := Random(AFrom - ATo) + ATo
  else
    Result := Random(ATo - AFrom) + AFrom;
end;

function NumerosAleatorios(Minimo, Maximo: integer): string;
var
  NumOk:Boolean;
  Numero: string;
begin
  Randomize;
  repeat
    Numero := IntToStr(RandomRange(Minimo, Maximo));
    if pos(Numero, Acumulador.Text) = 0 then
    begin
      result := Numero;
      Acumulador.Add(Numero);
      NumOk:=True;
    end;
  until NumOk;
end;

procedure TForm2.FormCreate(Sender: TObject);
begin
  Acumulador := TStringList.Create;
end;

//ejemplo de uso: showmessage(NumerosAleatorios(100,220));
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 00:54:42.


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