PDA

Ver la Versión Completa : RandomRange


Caral
02-10-2006, 20:39:57
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:


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:


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, 20:44:54
Hola,


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, 20:47:58
Prueba con esto ....

Randomize;
showmessage (inttostr(random(10)+1));

un saludo.

marcoszorrilla
02-10-2006, 20:48:29
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, 20:54:36
Hola,

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


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, 21:00:27
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, 21: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.


procedure Randomize;
var
Counter: Int64;
begin
if QueryPerformanceCounter(Counter) then
RandSeed := Counter
else
RandSeed := GetTickCount;
end;

Caral
02-10-2006, 21: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, 21:02:32
Hola,

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


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:


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:


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, 21:05:17
Hola,


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, 21: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, 21:07:55
... 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 (http://www.clubdelphi.com/foros/showthread.php?t=31226) quedo demostrado que los numeros asi generados no son tan "aleatorios" como deberian.

dec
02-10-2006, 21:24:04
Hola,


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"... ¿? ¿? ;)


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, 21: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