[ Foro de Pascal ]

Problema con Random y Randomize

01-Aug-2014 06:30
Francisco Snake
5 Respuestas

Hola, ¿cómo están? Hace un tiempo empecé a aprender Pascal y si bien no avancé tanto todavía, ya aprendí algunas cosas muy útiles.

Me encontré con un problema con Randomize y Random, que hasta ahora me venían funcionando muy bien :S

El problema es cuando creo un procedimiento o unit que utilice estas funciones para generar números aleatorios. Y aplico el procedimiento a dos variables distintas. El problema es que me arrojan SIEMPRE el mismo valor, o sea, los números generados por "random" son siempre los mismos. Acá hice un programa muy simplificado y sin mucha utilidad pero para que quede bien ilustrado el problema, a ver si alguien me puede ayudar a solucionarlo :/


Program random1;

var
  num: integer;
  num2: integer;

procedure aleatorio (var n: integer);
begin
  randomize;
  n:= random (100) + 1;
end;

begin
  num:= 5;
  num2:= 10;
  writeln ('"num" vale: ',num,'.');
  writeln ('"num2" vale: ',num2,'.');
  writeln;
  aleatorio (num);
  aleatorio (num2);
  writeln ('"num" ahora vale: ',num,'.');
  writeln ('"num2" ahora vale: ',num2,'.');
  writeln;
  readln;
end.


"num" y "num2" son dos variables distintas que inicialmente les doy valores diferentes. Cuando paso sus valores por el procedimiento que lleva el randomize y random dentro, ambas variables terminan valiendo lo mismo, es decir, el procedimiento no vuelve a generar valores aleatorios para "num2", sigue usando los valores aleatorios que utilizó para "num". Cada vez que echo a correr este programa, o "num" y "num2" valen ambos 99, o 44, o 1, o 57, o 60, o 89, o 87 o el número que sea, pero la cuestión es que siempre valen lo mismo uno con respecto al otro. Intenté poner "randomize" por todos lados, entre las dos llamadas al procedimiento que hago, dentro del procedimiento al principio y al final, pero nada funciona. No logro entender cual es el problema. Desde ya muchas gracias :)


01-Aug-2014 14:49
Luis Torres (+18)

No lo utilices dentro del procedimiento, sino al principio del programa principal, o si no, justo antes de la primera llamada al procedimiento "aleatorio" (pero solo una vez).
Saludos.


01-Aug-2014 20:15
Nacho Cabanes (+83)

Coincido con Luis. "Randomize" debe ser llamado una única vez, al principio del programa, o volverás a generar una nueva secuencia, con el agravante de que posiblemente se generará en el mismo milisegundo, por lo que tendrá la misma semilla y será la misma secuencia.


02-Aug-2014 04:59
Francisco Snake

Muchas gracias, me funcionó perfectamente! La verdad es que no entiendo bien entonces como funciona randomize, imaginé que al llamarlo cada vez se debería generar una nueva serie de números diferentes, pero evidentemente no :/ pero bueno lo importante es que funcionó, gracias! :D


02-Aug-2014 09:57
Nacho Cabanes (+83)

Te lo repito, detallando un poco más...  ;-)

Randomize inicia la generación de números aleatorios, usando una semilla cuyo valor se toma a partir del reloj interno del equipo. Por eso, debes usarlo sólo una vez. Si lo usas varias veces para generar varios números (o, de forma más general, varias secuencias de números), es probable que todas las secuencias comiencen en el mismo instante, por lo que tendrán la misma semilla y, por tanto, serán exactamente la misma secuencia.

http://www.aprendeaprogramar.com/mod/resource/view.php?id=360


04-Aug-2014 07:43
Francisco Snake

Muchas gracias!! Ahora lo entendí mucho mejor, me doy cuenta ahora de lo mal que venía interpretando la forma en la que trabajaba "randomize", un saludo muy grande!






(No se puede continuar esta discusión porque tiene más de dos meses de antigüedad. Si tienes dudas parecidas, abre un nuevo hilo.)