"Efectivo?" generador de números aleatorios en VB6
Bueno, este es un módulo q programe hace mucho para un juego en vb6, intenté jugar con la funcion Rnd sin usar la Randomize. gMaxNum es una variable global que no me acuerdo para q carajo era jejeje, na es el número max que puede devolver la función. Estudienlo q cambiando algunos valores se personaliza. Quizas a alguien le pueda servir.
Public Function intNumeroaleatorio() As Integer
Dim r As String, s As Integer, t As Integer, seacabo As Boolean
seacabo = False
Do While seacabo = False
r = CStr(Timer)
s = Len(r)
t = Mid(r, s, 1)
intNumeroaleatorio = (t * Int(gletras * Rnd))
r = CStr(intNumeroaleatorio)
s = Len(r)
t = Mid(r, s, 1)
intNumeroaleatorio = t
If intNumeroaleatorio >= 0 And intNumeroaleatorio < gMaxNum Then
seacabo = True
End If
Loop
End Function
Hola e mirado el source que aparece arriba, pero no consigo hacerlo funcionar. si no seria mucho pedir ¿pueden explicarme como se puede hacer funcionar, yo hice un codigo que creaba numeros aleatorios pero solo me respondia con 1s y 0s, es el siguiente:
Private Sub Command1_Click()
Dim Num As Byte
Randomize
Num = Rnd
Text1.Text = Num
End Sub
Yo quiero que me consiga numeros enteros entre 0 y 255, por lo que utilizé la variable byte, pero no se cual es el error que cometi.
Espero k me respondan Gracias :)
si miras en la ayuda, te dice que rnd te da valores entre 0 y 1, así que lo que tienes que hacer es:
Int((Límite_superior - límite_inferior + 1) * Rnd + límite_inferior)
Lo he probado y funciona:
Private Sub Command1_Click()
Dim Num As Byte
Num = Int(255 - 1) * Rnd + 0
Text1.Text = Num
End Sub
Un saludo!
Ok muchas gracias.
MMara una duda sobre la ayuda. Yo le doy al boton d la ayuda y me pide que instale la "coleccion MSDN". Eso que es un programa de ayuda o algo asi? :P
Graciassss ;)
La Coleccion MSDN (Microsoft Developer Network), Es La Ayuda Tipo CHM de Visual Studio 6.0, Esta ayuda Son 2 Discos, Por Lo Menos Esos Son Los Que Tengo Yo. ;)
Yo para hacer números aleatorios hago:
Rnd =((Int*el número máximo)-1
Yo para hacer numeros aleatorios uso:
Num = Int((Rnd * numero maximo)+1)
(esto me muestra un numero entre el: 1 al numero maximo
o si no:
Num = Int(Rnd * numero maximo)
(esto me muestra un numero entre el: 0 al numero maximo - 1
Cita de: el_chente23 en 22 Junio 2004, 05:57 AM
La Coleccion MSDN (Microsoft Developer Network), Es La Ayuda Tipo CHM de Visual Studio 6.0, Esta ayuda Son 2 Discos, Por Lo Menos Esos Son Los Que Tengo Yo. ;)
>>Ya y por si acaso, no sabes donde se podrían bajar esos discos? o simplemente hay que comprarselos a Microsoft?
>>Ya pues hombre! contesteis la questions o nadie sabe?
La verdad es que el codigo que postea diego994 es totalmente descartable. Ya que el Visual Basic 6 cuenta con un algoritmo interno lo cual fue optimizado para lograr un mejor desempeño en las aplicaciones.
Se utiliza
Randomize para que el Rnd sea <> al anterior.
Rnd Genera un numero entre 0.001 y 0.999.
Int Toma la parte entera redondeando para arriva
espero que les quede claro todo adios
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
¿si quiero generar numeros Pseudoaletorios? no necesito el random para eso....como lo harian
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??? ???
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.
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).
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 ;)
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
...
joder k cabeza la mia, la abia confundido con visible,jajajaj, lo siento
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.
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.
Aqui os mando una solucion muy sencilla para la generacion de numeros aleatorios q funciona perfectamente. La funcion randomize sirve para inicializar el generador sino os hara siempre la misma cadena de nºs aleatorios. Despues simplemete es la siguiente sintaxis:
num_aleatorio=((lim_superior-lim_inferior)*rnd)
Ejemplo de num aleatorio del 1 al 10:
Private Sub Command1_Click()
Dim num As Integer
Math.Randomize
num = ((10 - 0) * Rnd)
Text1.Text = num
End Sub
ASI DE SENCILLO NO OS KOMAIS MAS EL kOKO!!
bueno espero q os sirva de ayuda.
form.show
apoyo a unravel en lo que dice
Hola! Yo necesito saber si existe alguna forma de crear numeros aleatorios pero sin utilizar la funcion random,por favor ayudenme! ;D
aqui uno q hice
Randomize
Form1.ns1 = Int((Rnd() * 8) + 1)
Form1.ns2 = Int((Rnd() * 8) + 1)
Do While Form1.ns2 = Form1.ns1
Form1.ns2 = Int((Rnd() * 8) + 1)
Loop
Form1.ns3 = Int((Rnd() * 8) + 1)
Do While Form1.ns3 = Form1.ns1 Or Form1.ns3 = Form1.ns2
Form1.ns3 = Int((Rnd() * 8) + 1)
Loop
Form1.ns4 = Int((Rnd() * 8) + 1)
Do While Form1.ns4 = Form1.ns1 Or Form1.ns4 = Form1.ns2 Or Form1.ns4 = Form1.ns3
Form1.ns4 = Int((Rnd() * 8) + 1)
Loop
genera cuatro numeros aleatorios diferentes entre 0 y 9
solo necesitan cuatro textbox y esto lo ponen en form_load
hola
Alguien me podria decir como hacer un generador de numeros y letras
;D ;D
hola es la primera vez que me conecto con este foro y es exelente son de gran ayuda , quisiera saber com puedo llenar una grilla con numeros aleatorios
CitarAlguien me podria decir como hacer un generador de numeros y letras
para generar letras aleatoriamente, podrias asignarle una letra a cada numero
aca hice una pequeña demostracion
Private Sub Command1_Click()
Dim Num As Long
Dim Letra As String
Randomize 'para que no nos de siempre la misma cadena
Num = Rnd * 3 'al 3 lo tenes que cambiar por la cantidad de letras que hay
Select Case Num
Case "1" 'si el numero aleatorio (Num) es 1
Letra = "A" 'la Letra es A
Case "2"
Letra = "B"
Case "3"
Letra = "C"
End Select
Text1.Text = Letra 'Pone la letra aleatoria en un TextBox
End Sub
espero que te sirva ::D
Citarquisiera saber com puedo llenar una grilla con numeros aleatorios
soy de Argentina, a que te referis con grilla ?? XD
si lo que keres es llenar un textbox siempre con la misma cantidad de numeros seria asi:
Dim Num As Long
Math.Randomize
Num = Int(1000 - 100) * Rnd + 100
Text1.Text = Num
solo saldran numeros de 3 sifras
si no aclare tu duda, por favor postea de vuelta ^^
un abraz0 ;)
G0nz4
Buenas, a todos. Estoy intentando hacer un programa que genere numeros aleatorios.
De momento e conseguido que genere numeros aleatorios con el codigo expuesto en este post y ahora me interesaria que el programa comparara los numeros y dijera cual es el primer numero que sale repetido mas veces, cual es el segundo numero que sale mas veces despues del primero y cual es el 3r numero repetido que sale mas veces.
de momento esto es lo mas aproximado.
Private Sub Command1_Click()
Dim num As Integer
Math.Randomize
num = ((36 - 0) * Rnd)
Text1.Text = num
List1.AddItem Text1.Text
End Sub
Cuando genera los numeros los apunta en el listbox, la cuestion seria que sacara los 3 resultados de los numeros que mas veces se repiten en 3 texbox distintos por ejemplo,
No hace falta decir que he buscado por el tito google y por todas partes y no e encontrado nada, gracias de antemano ;).
desnut,hombre,reviviste un post de 3 años :¬¬,pregunta en uno nuevo...
Las cosas que uno hace ;D
jejejje, no me habia dado cuenta que el post tenia tanto xd, abrire otro haber k tal, gracias.
aqui les dejo este ejemplo que genera numeros y letras aleatoriamente
Private Sub Form_Load()
cadena = "abcdefghijklmnopqrstuvwxyz"
cadena = cadena & UCase(cadena)
cadena = cadena & "1234567980"
End Sub
Private Sub Command1_Click()
For i = 1 To 12 'aquí pueden poner la cantidad que no sea mayor al len() de la cadena
Randomize Time
num = CInt((1 - Len(cadena)) * Rnd + Len(cadena))
salida = salida & Mid(cadena, num, 1)
Next i
End Sub
:rolleyes: ;-) ;-) :silbar: