Autor
|
Tema: generador de numeros aleatorios en VB (Leído 99,140 veces)
|
Slasher-K
Desconectado
Mensajes: 1.477
|
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
|
|
« Última modificación: 1 Julio 2005, 07:05 am por Dunklerstern »
|
En línea
|
A la reina de las profundidades que cuida los pasos de una sombra en la noche :*
|
|
|
willmx
Desconectado
Mensajes: 1
|
¿si quiero generar numeros Pseudoaletorios? no necesito el random para eso....como lo harian
|
|
|
En línea
|
|
|
|
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??? ???
|
|
|
En línea
|
hispalink.es.kz --->>>foro empezando, se necesitan colaboradores; contenidos: peliculas, juegos pc, ps2, xxx, etc... pasate por aquí
|
|
|
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??? ???
Ya lo he averiguado, para quien quiera saberlo con poner un "randomize" en el "From1_load" vale, sale siempre números diferentes.
|
|
|
En línea
|
hispalink.es.kz --->>>foro empezando, se necesitan colaboradores; contenidos: peliculas, juegos pc, ps2, xxx, etc... pasate por aquí
|
|
|
Aphex
Desconectado
Mensajes: 6
|
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).
|
|
« Última modificación: 5 Enero 2005, 01:34 am por Aphex »
|
En línea
|
|
|
|
Trebor
Desconectado
Mensajes: 4
---<[Trebor]>---
|
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 = FalseEnd Subno hace falta,el control timer, como otros, por ejemplo el winsock, no se muestran en tiempo de ejecucion
|
|
|
En línea
|
|
|
|
zaerik
Desconectado
Mensajes: leet
|
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 , 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 ...
|
|
|
En línea
|
|
|
|
Trebor
Desconectado
Mensajes: 4
---<[Trebor]>---
|
joder k cabeza la mia, la abia confundido con visible,jajajaj, lo siento
|
|
|
En línea
|
|
|
|
Juan_Perez
Desconectado
Mensajes: 148
|
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.
|
|
|
En línea
|
|
|
|
Unravel
BlueHack Team
Ex-Staff
Desconectado
Mensajes: 1.016
|
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.
|
|
|
En línea
|
"La verdad es un ácido corrosivo que salpica casi siempre al que la maneja". Santiago Ramón y Cajal.
|
|
|
|
Mensajes similares |
|
Asunto |
Iniciado por |
Respuestas |
Vistas |
Último mensaje |
|
|
[Aporte]Generador de números aleatorios en Vb6 (con mínimo y máximo)
Programación Visual Basic
|
martin_poipon
|
5
|
8,072
|
28 Mayo 2011, 22:33 pm
por BlackZeroX
|
|
|
generador de numeros aleatorios de 5 cifras
Programación General
|
Enrique357
|
2
|
7,694
|
23 Diciembre 2011, 22:18 pm
por Valkyr
|
|
|
generador de números y suma de los mismos
Scripting
|
vidusa
|
4
|
3,383
|
31 Marzo 2012, 21:30 pm
por vidusa
|
|
|
[c]generador de numeros aleatoreos( se puede usar con la hora)
Programación C/C++
|
daryo
|
0
|
1,652
|
22 Septiembre 2013, 17:30 pm
por daryo
|
|
|
[BATCH] Generador de números aleatorios/random
Scripting
|
Tino
|
0
|
3,088
|
26 Noviembre 2017, 14:00 pm
por Tino
|
|