Menú

Mostrar Mensajes

Esta sección te permite ver todos los mensajes escritos por este usuario. Ten en cuenta que sólo puedes ver los mensajes escritos en zonas a las que tienes acceso en este momento.

Mostrar Mensajes Menú

Mensajes - Slasher-K

#541
Eso es lo que se llama race condition ;) y puede provocar resultados muy impredecibles y sobre todo dañinos.
#542
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