Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   OOP (https://www.clubdelphi.com/foros/forumdisplay.php?f=5)
-   -   numeros aleatorios no repetitivos (https://www.clubdelphi.com/foros/showthread.php?t=52135)

d-hugo 11-01-2008 13:33:05

numeros aleatorios no repetitivos
 
Hola a todos,

Necesito ayuda para un problema que debo resolver

Debo generar una tabla de 3 columnas que contenga valores aleatorios del 1 al 100, lo cual consigo fácilmente con la función randomrange, pero tengo dos dificultades que no se como vencer:

1- No se puede repetir un número en la misma fila.
2- No se puede repetir la misma combinación de números, aunque el orden sea diferente.

¿Alguien tiene alguna idea de como hacerlo?

Gracias de antemano.

Neftali [Germán.Estévez] 11-01-2008 13:44:04

He borrado la otra copia, y dejamos esta.
La próxima vez piensa antes de colocar el mensaje cual es el lugar adecuado, y si no lo tienes claro, ya lo moveremos, no te preocupes, pero es mejor que no envíes más de una copia.

Un saludo.

ElDioni 11-01-2008 15:22:30

Por ideas...
 
Vamos a ver lo que podrías hacer es declarar tres variables temporales para ir guardando los valores aleatorios que se te van generando, entonces...
meterías el 1º valor en la 1º variable, cuando metieses el segundo tendrías que comprobar que no es el mismo que el de la primera y cuando metas el tercero tendrás que comprobar que es distinto con respecto a la primera variable y a la segunda. Después de esto tendrás que comparar las variables con los datos ya introducidos en la tabla.
una variable que te indique si hay alguna fila con los mismos numeros, si al terminar de comprobar la fila la variable tiene un valor indicará que la fila es igual y si tiene otro es que alguno de los números es diferente. Yo lo haría con if anidados

Código Delphi [-]
if (variable1=fila(0,0)) OR (variable1=fila(0,1)) OR (variable1=fila(0,2)) then
 begin
  if (variable2=fila(0,0)) OR (variable2=fila(0,1)) OR (variable2=fila(0,2))then
   begin
    if (variable3=fila(0,0)) OR (variable3=fila(0,1)) OR (variable3=fila(0,2))then
     begin
      combinacionigual:=1;
     end
    else
     begin
      combinacionigual:=2;
     end;
   end
  else
   begin
    combinacionigual:=2;
   end;
 end
else
 begin
  combinacionigual:=2;
 end;

Esto tendrías que mejorarlo ya que yo he puesto las filas y las columnas con valores fijos. es para que cojas la idea. una vez hecha las dos comprobaciones ya puedes meter los valores que tienes en las tres variables en la tabla.

Espero que todo este rollo te sirva de algo.

Chris 11-01-2008 15:42:47

Antes de llamar al primer Random, llama un procedimiento llamado Randomize.
Código Delphi [-]
Randomize;
miNumero := Random(100);

Para acegurarte que una columna, no existan numero repetidos, puedes utilizar un TStringlist temporal, en donde le especifiques que no acepte valores repetidos.

Saludos.

PD: Llama Randomize por cada columna que vayas a llenar.

jachguate 11-01-2008 18:51:48

Cita:

Empezado por D&W (Mensaje 257445)
PD: Llama Randomize por cada columna que vayas a llenar.

Claro que esto no es necesario. Randomize inicializa la semilla basada en la hora actual, pero una vez inicializada, no hace falta inicializarla de nuevo.

Cita:

Empezado por delphi help
Do not combine the call to Randomize in a loop with calls to the Random function. Typically, Randomize is called only once, before all calls to Random.

Hasta luego.

;)

Chris 11-01-2008 21:10:26

Cita:

Empezado por jachguate (Mensaje 257510)
Claro que esto no es necesario. Randomize inicializa la semilla basada en la hora actual, pero una vez inicializada, no hace falta inicializarla de nuevo.

Me disculpan la torpeza, no había leído la última linea del help. :) ...
Do not combine the call to Randomize in a loop with calls to the Random function. Typically, Randomize is called only once, before all calls to Random.

d-hugo 13-01-2008 14:35:18

gracias
 
Gracias a todos.

El tip acerca del tstringlist es muy útil. De hecho me hizo buscar acerca de otros controles que permitieran gestionar duplicados, y encontré el tbasearray, de la unidad mxarrays (solo viene con el Delphi Enterprise). Alguien lo ha utilizado?

Por lo demás no he utilizado la función Random sino RandomRange, porque a menos que me equivoque, Random comienza en cero, y en mi caso el cero no es un valor aceptable. El randomize lo hago antes de cada fila, no antes de cada columna (y lo hago sólo para tener un grado más de seguridad de que los valores serán realmente aleatorios, aunque hay quienes dicen por la web que la función del Delphi tiende a distribuir los valores de una manera bastante similar).

En fin, gracias de nuevo. Y disculpen por haber colocado el tema doble, no pienso hacerlo nuevamente.


La franja horaria es GMT +2. Ahora son las 00:17:09.

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