generador de numeros aleatorios en VB

Iniciado por diego994, 19 Noviembre 2003, 17:38 PM

0 Miembros y 4 Visitantes están viendo este tema.

Slasher-K

#10
Para crear VERDADEROS números aleatorios en VB hay que crear nuestro propio algoritmo usando varios valores variables y combinándolos. Si queremos valores aleatorios necesitamos recurrir a la API de Win2, por ejemplo a las funciones GetTickCount, GetCurrentProcessId, GetCurrentProcess, GetCurrentThreadId. Mezclando los valores devueltos por estas funciones, más la fecha y hora actuales, más algún número generado a partir de una CLSID aleatoria, podemos obtener un número aleatorio.

La idea de un número aleatorio es que no se repita en el tiempo, por lo tanto para crearlo tenemos que intentar usar parámetros que tampoco se repitan en el tiempo.

Abajo dejo un ejemplo sencillo de como generar un nº aleatorio. Para usarlo hay que agregar una referencia a WIN.TLB

Function Rand(Optional Seed As Long) As Currency
          Dim lpMem As MEMORYSTATUS
          Dim lTime&, lProc&, lProcId&
          Dim lDate&, cRand@

  If Seed <= 0 Then Seed = Rnd * GetClsidCount
 
  'Datos que se usarán para generar el número aleatorio.
  '
  Call GlobalMemoryStatus(lpMem)
  lTime = timeGetTime
  lProc = GetCurrentProcess
  lProcId = GetCurrentProcessId
  lDate = CLng(Date)
 
  cRand = (lpMem.dwAvailVirtual Mod lTime) Xor _
               ((lTime Xor (lProc Mod lProcId)) Xor _
               (lProcId + (lDate Xor lpMem.dwTotalPageFile)))

  Rand = cRand
End Function



A la reina de las profundidades que cuida los pasos de una sombra en la noche :*

willmx

¿si quiero generar numeros Pseudoaletorios? no necesito el random para eso....como lo harian

capi

tengo una duda y es que cuando uso rnd me sale todo bien pero siempre sale la misma cadena de numeros y por orden, alguien sabe como arreglar esto??? ???
hispalink.es.kz --->>>foro empezando, se necesitan colaboradores; contenidos: peliculas, juegos pc, ps2, xxx, etc... pasate por aquí

capi

Cita de: capi en 30 Diciembre 2004, 08:30 AM
tengo una duda y es que cuando uso rnd me sale todo bien pero siempre sale la misma cadena de numeros y por orden, alguien sabe como arreglar esto??? ???

Ya lo he averiguado, para quien quiera saberlo con poner un "randomize" en el "From1_load" vale, sale siempre números diferentes.
hispalink.es.kz --->>>foro empezando, se necesitan colaboradores; contenidos: peliculas, juegos pc, ps2, xxx, etc... pasate por aquí

Aphex

#14
Hola, feliz año a todos. Soy nuevo en el foro. Aunque solo soy un principiante en programación, al ver este mensaje se me ha ocurrido que quizás podría aportar algo.

Voy a poner una manera sencilla de sacar numeros aleatorios en VB6.

Hace poco realicé un simulador de dados (uno de 8 caras y otro de 100). A continuación os pongo el código del de 8:

Creais un nuevo proyecto (exe stándard) y añadís un botón (Command1), un timer  (Timer1) y un label (Label1).

El código sería:

-------------------------------------------------------------------

Private Sub FormLoad()
Timer1.Enabled = False
End Sub
_______________________________________________

Private Sub Command1_Click()
Dim numero as Byte
Timer1.Enabled = True

Randomize Timer
              numero = rnd * 8

      Do While numero > 8
              numero = numero - 8
Loop
     
      Do While numero < 1
              numero = numero + 8
Loop
label1.Caption = numero
End Sub

------------------------------------------------------------
Y ya está. Cada vez que se hace clic en el botón, el programa genera diferentes números comprendidos entre el 1 y el 8 los cuales se muestran en el label1 (para el de 100 caras, se sustituye el 8 por el 100).

Espero que os sirva. ^^

PD: También espero que a los moderadores no les moleste que lo haya puesto sin el "code", pero creo que así se ve más claro (aunque si hace falta, pues me lo decís y lo cambio).

Trebor

Cita de: Aphex en  4 Enero 2005, 11:00 AM
Hola, feliz año a todos. Soy nuevo en el foro. Aunque solo soy un principiante en programación, al ver este mensaje se me ha ocurrido que quizás podría aportar algo.

Voy a poner una manera sencilla de sacar numeros aleatorios en VB6.

Hace poco realicé un simulador de dados (uno de 8 caras y otro de 100). A continuación os pongo el código del de 8:

Creais un nuevo proyecto (exe stándard) y añadís un botón (Command1), un timer  (Timer1) y un label (Label1).

El código sería:

-------------------------------------------------------------------

Private Sub FormLoad()
Timer1.Enabled = False
End Sub
_______________________________________________

Private Sub Command1_Click()
Dim numero as Byte
Timer1.Enabled = True

Randomize Timer
              numero = rnd * 8

      Do While numero > 8
              numero = numero - 8
Loop
     
      Do While numero < 1
              numero = numero + 8
Loop
label1.Caption = numero
End Sub

------------------------------------------------------------
Y ya está. Cada vez que se hace clic en el botón, el programa genera diferentes números comprendidos entre el 1 y el 8 los cuales se muestran en el label1 (para el de 100 caras, se sustituye el 8 por el 100).

Espero que os sirva. ^^

PD: También espero que a los moderadores no les moleste que lo haya puesto sin el "code", pero creo que así se ve más claro (aunque si hace falta, pues me lo decís y lo cambio).
buenas, gracias por el code, pero creo k el

Private Sub FormLoad()
Timer1.Enabled = False
End Sub

no hace falta,el control timer, como otros, por ejemplo el winsock, no se muestran en tiempo de ejecucion ;)

zaerik

Cita de: Trebor en 12 Enero 2005, 08:26 AM
buenas, gracias por el code, pero creo k el

Private Sub FormLoad()
Timer1.Enabled = False
End Sub


no hace falta,el control timer, como otros, por ejemplo el winsock, no se muestran en tiempo de ejecucion ;)

Creo que te equivocas de funcion :P, esa funcion lo que hace es que al cargar el programa el timer1 se desactive, porque al autor del programa le interesaba que el timer1 solo se active cuando le de a un boton, por eso luego usa la funcion:

Private Sub Command1_Click()
Dim numero as Byte
Timer1.Enabled = True
...

Trebor

joder k cabeza la mia, la abia confundido con visible,jajajaj, lo siento

Juan_Perez

Les dejo una función que genera números aleatorios. Esta está codificada en Pascal pero se puede adaptar fácilmente a Visual Basic, sólo usa las operaciones aritméticas y los operadores binarios DIV y MOD, los cuales dan el cociente y el residuo de una división entera respectivamente. Esta función y el texto en cursiva abajo lo saqué del libro "Pascal Avanzado. Técnicas de Programación" de Paul Sand, de la editorial McGraw-Hill 1985. Libro excelente para el programador en general, no sólo el que programa en Pascal, ya que su énfasis es en las técnicas de programación antes que en un lenguaje específico como Pascal. En el desarrollan en cada capítulo programas útiles o interesantes (entrada interactiva, una calculadora de propósito general, el juego de tablero reversi, simulación y animación y en el último capítulo un auténtico proyecto: una hoja de cálculo).
Esta función viene en el apéndice del libro y el autor la puso para resolver problemas de transportabilidad con las versiones de Pascal que no soportaban números aleatoreos, función que el usa en el capítulo de simulación y animación.

function random: integer;
{ Devuelve un entero aleatorio en el rango 0..32767 }
var
   i, j, carry, t: integer;
begin { random }
   for i := 1 to 7 do begin
      carry := 0;
      for j := 1 to 4 do begin
         t := 2 * seed[j] + carry;
         carry := t div 256;
         seed[j] := t mod 256
      end;
      if (seed[1] div 128) <> (seed[4] div 128) then
         seed[1] := (seed[1] + 1) mod 256
   end;
   random := 256 * (seed[1] div 2) + seed[3]
end;

   Este array debe ser global para que guarde sus valores entre diferentes llamadas a random. El array debe ser inicializado antes de cualquier llamada a random; por ejemplo:
...
seed[1] := 90;
seed[2] := 178;
seed[3] := 246;
seed[4] := 147;
...
   Sin embargo, si asignamos los valores iniciales al array seed de esta forma, obtendremos siempre la misma secuencia aleatoria (lo cual es deseable en muchas circunstancias). Para evitar esto, Apple Pascal suministra el procedimiento randomize, el cual hace que se generen diferentes secuencias aleatorias. El mismo efecto puede obtenerse cambiando los elementos del array seed a otros valores antes de que se haga cualquier llamada a random; cómo puede hacerse esto se lo dejamos a usted. Por ejemplo, podría coger el intervalo de tiempo en ciclos de máquina entre la pulsación de dos teclas.
   Esta rutina fue extraída de Seminumerical Algortihms de D. Knuth (Adison-Wesley, 1981). Esta obra clásica contiene información sobre aritmética y generadores de números aleatoreos.

Unravel

Quería puntualizar una cosa nada mas,

Si alguno conseguís generar números aleatorios, habreis revolucionado el mundo ;)

Si la misma semilla genera el mismo número (como ocurre siempre) ya no son número aleatorios.
"La verdad es un ácido corrosivo que salpica casi siempre al que la maneja". Santiago Ramón y Cajal.