viernes, 26 de noviembre de 2010

Generador de numeros aleatorios (puntos extra)

hola , buenas noches  aqui les pondre una introduccion de cual es la idea de un generador de numeros aleatorios , aunque me gustaria poner algunos  ejemplos visuales de los programas que e hecho ,  sigo batallando con mi compu ya que ni siquiera compila el c++ , pero bueno  espero les sea de ayuda esta informacion 

Un Generador de números aleatorios es un componente o funcionalidad que crea números o símbolos para un programa software en una forma que carezca de un patrón evidente, y que así parezcan ser números aleatorios.
La mayor parte de los generadores de números aleatorios son, en realidad, pseudoaleatorios: se calcula (o introduce internamente) un valor X0, que llamaremos semilla, y, a partir de él, se van generando X1, X2, X3, ...
Siempre que se parta de la misma semilla, se obtendrá la misma secuencia de valores.
El algoritmo básico es el método congruencial123, que genera valores en el intervalo [0,1), mediante el siguiente esquema: 

Las principales ventajas de los generadores de números aleatorios son:

- Rapidez

- Comodidad
- Reproducibilidad
- Portabilidad

Y la
desventaja fundamental:

- Las secuencias obtenidas no son realmente aleatorias, ya que se obtienen con operaciones deterministas. Solo podemos obtener secuencias
pseudo-aleatorias, que a su vez satisfacen algunos criterios de aleatoriedad adecuados.

Los números generados deben cumplir ciertas características para que sean válidos. Dichas características son:


1. Uniformemente distribuidos.

2. Estadísticamente independientes.
3. Su media debe ser estadísticamente igual a 1/2.
4. Su varianza debe ser estadísticamente igual a 1/12.
5. Su periodo o ciclo de vida debe ser largo.
6. Deben ser generados a través de un método rápido.
7. Generados a través de un método que no requiera mucha capacidad de almacenamiento de la computadora.

Normalmente se utilizan números enteros, ya que su aritmética es exacta y rápida. Se generan enteros Ni O y M-1 , y xi = Ni/M da valores reales en el intervarlo [0,1)

En general los algoritmos utilizan relaciones de recurrencia del tipo entre
Ni = f( Ni - 1)
en el caso de recurrencia simple, o bien
Ni = f(Ni - 1 ...Ni-n)
para el caso de una recurrencia de orden k.

Se necesitará dar un valor inicial para comenzar el algori
tmo (k valores para recurrencias de orden k ). 

Algunos ejemplos reales seria donde aplicara los metodos de probabilidad, los que se me ocurren ami  ya que me gusta mucho jugar son los juegos como la baraja y las diversas formas de jugar con ella
miren aqui les pongo el link de una pagina que muestra  un ejercisio que se aplica a esto 

ejemplos 

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

Código:
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




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

Crear 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).
PD: También espero que  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 dicen  y lo cambio).


1 comentario:

  1. Hay pedazos que no se ve ni con buena voluntad... Sería bueno ser explícito sobre las referencias bibliográficas. +3 en segundas

    ResponderEliminar