Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Varios (https://www.clubdelphi.com/foros/forumdisplay.php?f=11)
-   -   RandomRange (https://www.clubdelphi.com/foros/showthread.php?t=36107)

Caral 02-10-2006 19:39:57

RandomRange
 
Hola y Saludos a Todos

Tengo una pequeña consulta:

Estoy haciendo un juego Matematico para mi hija,(La de La Foto) para que se aprenda las tablas de multiplicar,
y necesito generar un numero al azar.

Tengo un edit en el que quiero poner un numero al azar entre 1 a 10.

La Funcion:

Código Delphi [-]
function RandomRange(const AFrom, ATo: Integer): Integer;

Se supone que hace esto, pero no se como hacerlo ya que indica el Help de Delphi que hay que llamar previamente a RandSeed, que no se que es.

Se supone que estas AFrom y ATo son variables integer, bueno pues:

Pregunta:

Cita:

Como se ponen y en donde los valores que van del 1 al 10? de estas variables
Como se llama a esta funcion, simplemente por su nombre o como ?
Gracias por su ayuda
Saludos

dec 02-10-2006 19:44:54

Hola,

Código Delphi [-]
uses
  Math;

procedure TForm1.Button1Click(Sender: TObject);
var
  numeroAleatorioDelUnoAlCien: Integer;
begin
  RandSeed;
  numeroAleatorioDelUnoAlCien := Math.RandomRange(1, 100);
  ShowMessage( IntToStr(numeroAleatorioDelUnoAlCien) );
end;

mierda 02-10-2006 19:47:58

a ver con esto
 
Prueba con esto ....

Código Delphi [-]
Randomize;
showmessage (inttostr(random(10)+1));

un saludo.

marcoszorrilla 02-10-2006 19:48:29

Código Delphi [-]
uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls,Math;
procedure TForm1.Button1Click(Sender: TObject);
begin
Randomize;
Edit1.Text:=IntToStr(RandomRange(1, 10));
end;

Un Saludo.

dec 02-10-2006 19:54:36

Hola,

Vale... reconozco que me confundí, puesto que además no he usado nunca "RandomRange", sino "Random", pero...

Cita:

Empezado por Ayuda de Delphi
To initialize the random number generator, add a single call Randomize or assign a value to the RandSeed variable before making any calls to RandomRange.

Es decir, donde antes escribo "RandSeed" (mira que ví que era una variable, no una función...), debería escribirse "Randomize", aunque, esto de los números aleatorios me supera... y casi mejor me hubiera estado calladito y dejar a quien verdaderamente sepa de este tema que sea quien ayude. ;)

mierda 02-10-2006 20:00:27

uyyyyyyy ...
 
Me falto ponerte la unidad .....

Pero me ha sorprendido la velocidad con la que estais todos al loro .... mu buen gesto si señor!!!

enga ... un saludo.

seoane 02-10-2006 20:01:14

;) Jeje, ya te iva a llamar la atencion dec. Randseed es como su propio nombre indica una "semilla", para un mismo valor de RandSeed la secuencia de numeros "aleatorios" que se genera es la misma. De hecho el metodo Randomize lo unico que hace es asignarle un valor obtenido del reloj del sistema, para intentar que la secuencia originada siempre sea diferente.

Código Delphi [-]
procedure Randomize;
var
  Counter: Int64;
begin
  if QueryPerformanceCounter(Counter) then
    RandSeed := Counter
  else
    RandSeed := GetTickCount;
end;

Caral 02-10-2006 20:01:57

Maestros mil gracias
funcionan perfectamente,
La de Dec no se porque hay que quitarle RandSeed, si no da un error, tal vez me indicas que paso Dec, te lo agradeceria mucho asi no me quedo con la duda.
Saludos y gracias de nuevo.

dec 02-10-2006 20:02:32

Hola,

Ten en cuenta lo que dice la ayuda sobre el procedimiento "Randomize", entre otras cosas:

Cita:

Empezado por Ayuda de Delphi
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.

Es decir, más bien que esto:

Código Delphi [-]
procedure TForm1.Button1Click(Sender: TObject);
var
  i: integer;
  numeroAleatorioDelUnoAlCien: Integer;
begin
  for i := 1 to 100 do
  begin
    Randomize;
    numeroAleatorioDelUnoAlCien := Math.RandomRange(1, 100);
    Caption := IntToStr(numeroAleatorioDelUnoAlCien);
  end;
end;

... mejor hacer esto otro, o sea, quitar el "Randomize" del bucle:

Código Delphi [-]
procedure TForm1.Button1Click(Sender: TObject);
var
  i: integer;
  numeroAleatorioDelUnoAlCien: Integer;
begin
  Randomize;
  for i := 1 to 100 do
  begin
    numeroAleatorioDelUnoAlCien := Math.RandomRange(1, 100);
    Caption := IntToStr(numeroAleatorioDelUnoAlCien);
  end;
end;

dec 02-10-2006 20:05:17

Hola,

Cita:

Empezado por Caral
La de Dec no se porque hay que quitarle RandSeed, si no da un error, tal vez me indicas que paso Dec, te lo agradeceria mucho asi no me quedo con la duda.

Bueno, arriba creo que hablo sobre el tema, empero, a mí me "compila" el código del ejemplo (aunque equivocado), así que, tendrías que referir por aquí de qué error se trata: "mi bola de cristal tiene nubes". :D

Caral 02-10-2006 20:07:33

Gracias ya entendi lo de RandSeed pero
Os aveis puesto a pensar que ninguna respuesta fue en vase a Funcion, todos pusisteis Procedimientos (Procedure), hay alguna razon en particular o el llamado a una funcion es mas complicado ?, no resulta conveniente o ???
Saludos

seoane 02-10-2006 20:07:55

Cita:

Empezado por dec

... mejor hacer esto otro, o sea, quitar el "Randomize" del bucle:

Muy cierto, lo mejor es llamarlo solo una vez en toda la aplicacion. Con respecto a meter el Randomize dentro del bucle, en este hilo quedo demostrado que los numeros asi generados no son tan "aleatorios" como deberian.

dec 02-10-2006 20:24:04

Hola,

Cita:

Empezado por Seoane
Muy cierto, lo mejor es llamarlo solo una vez en toda la aplicacion.

Ajá,... o sea, que, para mayor "seguridad" lo suyo es ejecutarlo una vez en ¿la vida de la aplicación?... no ya una vez fuera de un bucle cualquiera, sino que, pareciera por lo que dices que el código que puse anteriormente (dentro del evento "onclick" de un botón) no sería el mejor lugar para situar la llamada a "Randomize"... tal vez en la inicialización de cierta unidad, o en el evento "OnCreate" del formulario principal... o en el propio "dpr"... ¿? ¿? ;)

Cita:

Empezado por Caral
Os aveis puesto a pensar que ninguna respuesta fue en vase a Funcion, todos pusisteis Procedimientos (Procedure), hay alguna razon en particular o el llamado a una funcion es mas complicado ?, no resulta conveniente o ???

Bueno. "RandomRange" es una función. "Randomize" no, pero, eso no es cosa nuestra... ;) Es algo que nos viene dado, o sea. Piensa que un procedimiento se diferencia de una función en que esta última retorna un valor de forma "natural", mientras que un procedimiento no lo hace. No se trata de que una cosa sea más "difícil" que la otra, me parece a mí, vaya. ;)

"RandomRange" tiene que retornar algo, precisamente, el número aleatorio, mientras que "Randomize" no; simplemente se llama a este procedimiento, pero, no esperamos ningún valor como resultado.

Caral 02-10-2006 20:31:37

Muchas Gracias a todos por la amplia explicion, ya saveis que no me conformo con la respuesta corta:D , con esa no se aprende.:rolleyes:
Gracias a todos los Maestros
Saludos


La franja horaria es GMT +2. Ahora son las 07:05:02.

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