Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Principal > Varios
Registrarse FAQ Miembros Calendario Guía de estilo Buscar Temas de Hoy Marcar Foros Como Leídos

Grupo de Teaming del ClubDelphi

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 04-10-2006
Avatar de DarkDrakon
DarkDrakon DarkDrakon is offline
Miembro
 
Registrado: abr 2005
Ubicación: Tacna - Peru
Posts: 46
Poder: 0
DarkDrakon Va por buen camino
Question Generación de Números Aleatorios

Buenas con todos los amigos foristas .... Bueno aqui va mi pregunta, quisiera generar o crear numeros aleatorios, pero quisiera hacerlo sin tener la necesidad de usar la funcion Random(), ni Randomize().

Bueno no se si se pueda hacer esto, bueno creo que si, pero no se como es que deberia empezar. No les pido que me digan todo, solo alguna idea de como empezar . Les agradezco de antemano.
__________________
Dark Drakon::


"Ego sum Draco dormiens ... Aut insanit Draco, aut Versus facit..."

Responder Con Cita
  #2  
Antiguo 04-10-2006
Avatar de Ñuño Martínez
Ñuño Martínez Ñuño Martínez is offline
Moderador
 
Registrado: jul 2006
Ubicación: Ciudad Catedral, Españistán
Posts: 6.000
Poder: 25
Ñuño Martínez Tiene un aura espectacularÑuño Martínez Tiene un aura espectacular
Una forma de generar números pseudo-aleatorios puede ser la siguiente:
Código Delphi [-]
VAR
  RandomSeed: LONG;

FUNCTION Random: LONG;
BEGIN
  RandomSeed := (RandomSeed * 27584621) + 1;
  Random := RandomSeed RSH 16;
END;

Lo he traducido de un código fuente en C, así que no sé si funciona del todo bien. Posiblemente debas usar algún que otro molde.

Por cierto, el rango de los números aleatorios es de 0 a 2^16.
Responder Con Cita
  #3  
Antiguo 06-10-2006
Avatar de seoane
[seoane] seoane is offline
Miembro Premium
 
Registrado: feb 2004
Ubicación: A Coruña, España
Posts: 3.717
Poder: 24
seoane Va por buen camino
Otro algoritmo diferente:

Código Delphi [-]
var
  Semilla: Cardinal;

function Random2(Rango: Cardinal): Integer;
var
  i: Integer;
begin
  for i:= 1 to 32 do
  begin
    Semilla:= Semilla shl 1;
    Semilla:= Semilla or $01;
    Semilla:= Semilla xor ((Semilla shr 2) and $01);
    Semilla:= Semilla xor ((Semilla shr 3) and $01);
    Semilla:= Semilla xor ((Semilla shr 5) and $01);
    Semilla:= Semilla xor ((Semilla shr 7) and $01);
    Semilla:= Semilla xor ((Semilla shr 11) and $01);
    Semilla:= Semilla xor ((Semilla shr 13) and $01);
    Semilla:= Semilla xor ((Semilla shr 17) and $01);
    Semilla:= Semilla xor ((Semilla shr 19) and $01);
    Semilla:= Semilla xor ((Semilla shr 23) and $01);
    Semilla:= Semilla xor ((Semilla shr 29) and $01);
    Semilla:= Semilla xor ((Semilla shr 31) and $01);
  end;
  Result:= Semilla mod Rango;
end;

Se utiliza igual que el Random de toda la vida, y en este caso también hay que acordarse de darle un valor inicial a la semilla. Aquí un ejemplo de como usarlo, y una prueba de que tal funciona:

Código Delphi [-]
var
  i,j,k: integer;
  Str: string;
  X: array[0..255] of Integer;
begin
  FillChar(X, Sizeof(X), 0);
  // Le damos un valor a la semilla
  Semilla:= GetTickCount;
  // Generamos cien mil numeros aletorios
  for i:= 1 to 100000 do
    inc(X[Random2(256)]);
  j:= MAXINT;
  k:= 0;
  // Mostramos de veces que aperece cada numero
  for i:= 0 to 255 do
  begin
    if j > X[i] then j:= X[i];
    if k < X[i] then k:= X[i];
    if i mod 10 = 0then
      Str:= Str + #13;
    Str:= Str +  IntToStr(X[i]) + ',';
  end;
  Str:= Str + #13#13 +
    'El valor mas bajo es: ' + IntToStr(j) + #13 +
    'El valor mas alto es: ' + IntToStr(k);
  // Si funciona bien deben mostrarse valores
  // cercanos para todos los numeros.
  ShowMessage(Str);
end;

Otra forma de generar números "aleatorios" es utilizar un algoritmo de encriptación, donde cada numero es el anterior encriptado. Utilizando un buen algoritmo, AES, MD5, Serpent, etc ... la secuencia sera tan difícil de descifrar, como lo sera romper el algoritmo.
Responder Con Cita
  #4  
Antiguo 09-10-2006
Avatar de DarkDrakon
DarkDrakon DarkDrakon is offline
Miembro
 
Registrado: abr 2005
Ubicación: Tacna - Peru
Posts: 46
Poder: 0
DarkDrakon Va por buen camino
Smile Gracias

Muchas gracias a los 2 por responder ... ahora lo pondre en practica y despues ya vere lo que pasa .
__________________
Dark Drakon::


"Ego sum Draco dormiens ... Aut insanit Draco, aut Versus facit..."

Responder Con Cita
  #5  
Antiguo 10-10-2006
Avatar de Delphius
[Delphius] Delphius is offline
Miembro Premium
 
Registrado: jul 2004
Ubicación: Salta, Argentina
Posts: 5.582
Poder: 25
Delphius Va camino a la fama
Un poco mas...

Quisiera aportar un poco de información al asunto.

He visto el código que muestra Seoane y me he preguntado: ¿No es demasiado procesamiento hacer operaciones de corrimiento de bits?

Yo hago empleo de geenradores multiplicativos congrenciales mixtos y multiplicativos... que son los más usados y mejores.

Haz una búsqueda en los foros.... he posteado en más de una ocasión sobre esto.. no se si te sirva.. pero con aportar un poco no se pierde nada.

Saludos,
__________________
Delphius
[Guia de estilo][Buscar]
Responder Con Cita
  #6  
Antiguo 10-10-2006
Avatar de seoane
[seoane] seoane is offline
Miembro Premium
 
Registrado: feb 2004
Ubicación: A Coruña, España
Posts: 3.717
Poder: 24
seoane Va por buen camino
Cita:
Empezado por Delphius
He visto el código que muestra Seoane y me he preguntado: ¿No es demasiado procesamiento hacer operaciones de corrimiento de bits?

Yo hago empleo de geenradores multiplicativos congrenciales mixtos y multiplicativos... que son los más usados y mejores.
Lo de que sean mejores los algoritmos que tu usas no te lo discuto, al fin y al cabo el que aquí expongo, lo cree en 5 minutos y sin ningún tipo de análisis estadístico. Pero por qué afirmas que hacer desplazamiento de bits es "demasiado", ¿a que te refieres con eso?.

Me gustaría ver tus algoritmos para generar números aleatorios, seguramente con mucha mas base matemática que los mios. Y aunque tengo un poco oxidada esa materia desde que salí de la universidad nunca esta de mas aprender algo.
Responder Con Cita
  #7  
Antiguo 10-10-2006
Avatar de Delphius
[Delphius] Delphius is offline
Miembro Premium
 
Registrado: jul 2004
Ubicación: Salta, Argentina
Posts: 5.582
Poder: 25
Delphius Va camino a la fama
Cita:
Empezado por Seoane
Lo de que sean mejores los algoritmos que tu usas no te lo discuto, al fin y al cabo el que aquí expongo, lo cree en 5 minutos y sin ningún tipo de análisis estadístico. Pero por qué afirmas que hacer desplazamiento de bits es "demasiado", ¿a que te refieres con eso?.
A lo que me refiero es que tengo entendido que hacer operaciones de corrimiento de bits, (shr, shl), hacen que se requiera de más numero de operaciones.. y que estos tipos de operaciones son "lentas". Y si se están en un ciclo.... más todavía.

Cita:
Empezado por Seoane
Me gustaría ver tus algoritmos para generar números aleatorios, seguramente con mucha mas base matemática que los mios. Y aunque tengo un poco oxidada esa materia desde que salí de la universidad nunca esta de mas aprender algo.
Tu generador es multiplicativo... va a funcionar bien, todo dependerá de que valor ingrese en Rango.... la serie que puede generar dependerá de ello.

Que tienen mayos base matemática... no creo. No hubo mucho avance en lo que hace a generación de numeros aletorios. La "técnica" es emplear no uno, sino varios en "cadena" para producir series aún más grandes. Tal es el caso del generador del ARENA, que tiene series del orden de los 10^149 si mas no me equivoco... pasarían 49 años antes de que se repita la secuencia.

Si los quieres, están por aqui.... en los foros... ahorita estoy en l trabajo... si logro enontrarme un tiempo te los paso en otra oportunidad.

Saludos,
__________________
Delphius
[Guia de estilo][Buscar]
Responder Con Cita
  #8  
Antiguo 10-10-2006
Avatar de seoane
[seoane] seoane is offline
Miembro Premium
 
Registrado: feb 2004
Ubicación: A Coruña, España
Posts: 3.717
Poder: 24
seoane Va por buen camino
Era eso, pues no te preocupes, las operaciones desplazamiento de bit shl y shr se corresponden a una sola instrucción de ensamblador. De echo se utilizan mucho para dividir y multiplicar por potencias de dos de forma rápida. No se como de "lentas" serán pero en ningún caso mas que una operación de multiplicación o división.
Responder Con Cita
  #9  
Antiguo 10-10-2006
nemesio nemesio is offline
Miembro
 
Registrado: nov 2005
Ubicación: Isla de Margarita, Venezuela
Posts: 377
Poder: 19
nemesio Va por buen camino
Podrías tener tambien numeros aleatorios de la hora al descomponerla y tomar un milisegundo.

Saludos
Responder Con Cita
Respuesta


Herramientas Buscar en Tema
Buscar en Tema:

Búsqueda Avanzada
Desplegado

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
Función números aleatorios Sarola Oracle 6 17-11-2005 21:26:02
Generador de números aleatorios gontxalo OOP 16 09-06-2005 21:38:07
registros aleatorios Paulina Tablas planas 1 03-12-2004 07:53:38
Crear una Grid con numeros aleatorios ¿Como le hago? aragorneuf Varios 7 24-04-2004 02:29:48
numeros aleatorios emeritos Varios 1 24-11-2003 14:09:43


La franja horaria es GMT +2. Ahora son las 01:23:14.


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