Hola, miren tengo un problema y es que en un programa que quiero hacer para estudiar juegos de azar, lo que pasa es que tengo que hacer un bucle dentro de otro y yo no lo se hacer.
El programa tiene un Botón(3), un Label(6) y un Textbox(2).
El programa funciona de la siguiente forma:
Tu ingresas un nº en un Textbox y al darle a al Botón lo que hace el programa es, imaginaos que tira un dado de dos caras (imaginaos aunque sea imposible) pues el nº que ingreses en el Textbox es el nº de veces que se repite la misma cara y en el Label quiero que me aparezca el nº de veces que el programa a necesitado tirarlo para sacar tal nº.
Pensé que el programa debería tener esta apariencia:
Private Sub Button3_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button3.Click
Label6.Text = 0
If TextBox2.Text = ("") Then TextBox2.Text = 0
Dim a As Integer
Dim b As Integer = TextBox2.Text
Dim c As Integer = TextBox2.Text
For b = 1 To b
a = Rnd(1)
If a < 0.5 Then Label6.Text = Label6.Text + 1
If a < 0.5 Then
For c = 1 To c
If a < 0.5 Then Label6.Text = Label6.Text + 1
Aquí es donde irían los infinitos bucles
If a > 0.5 Then Label6.Text = Label6.Text + 1
Next c
End If
If a > 0.5 Then Label6.Text = Label6.Text + 1
Next b
End Sub
Y dentro del segundo bucle otro con otra variable y otro con otra variable... Pero no tendría fin porque para hacer el programa bien tendría que hacer infinitos bucles con infinitas variables.
Espero que lo hayan entendido y que me ayuden.
Gracias.
Lo primero de todo es que esto es VB.NET y no va aqui.
Lo segundo po las etiquetas Geshi para que tu codigo sea legible o enserio nadie lo va a leer porque duele a la vista
Lo tercero el ejemplo que te voy a dar va a estar en vb6 porque desconozco vb.net
If not IsNumeric(Textbox2.Text) then exit sub
Dim numeroVecesTotal as integer
Dim numeroVeces as integer
Dim a as integer
Dim cnt asinteger
numeroVecesTotal = textbox2.text
Do while not numeroVeces = numeroVecesTotal
a = CInt(Rnd)
numeroVeces = numeroVeces + a
cnt = cnt + 1
Loop
Label6.text = cnt
Muchas gracias y perdón por no poner el código donde debía pero para que sirve "CInt"
Gracias.
Cint lo que hace es redodear el numero a un integer es decir.
En nuestro caso si el num es >= 0.5 entonces retornara 1 y si es < 0.5 retornara 0
Una cosa que acabo de ver es que el código fuente que me diste esta mal: Imaginemos que en el textbox pongo un 3 y tu programa programa hace cint(rnd) y en ese cint(rnd) sale 1,0,1,1 si no me he equivocado en el label tendría que poner 4 pero en este ejemplo no a salido 3 veces seguidas el número 1 que es lo que quiero.
Ejemplo bueno
Textbox = 5
cint(rnd) --> 1,0,1,0,0,0,1,1,1,1,1.
En este caso si se ha repetido el 1 cinco veces y en el label pondría 11 que es el nº de veces que el bucle se ha tenido que ejecutar.
Espero que me hayas entendido.
Gracias de antemano.
(Hablando de VB.NET)
Amm no me acuerdo muy bien pero la clase string tiene la funcion split...
TextBox2.Text.Split(",")[0]
TextBox2.Text.Split(",")[1]
TextBox2.Text.Split(",")[2]
* si estas en VB .NET en lugar de usar CInt() usa Convert.ToInt32() o Convert.ToInt64() para transformar una string en un integer (32/64)
* si vas a redondear usa Math.Round() mas no las funciones anteriores...
Dulces Lunas!¡.
Si te digo la verdad soy un principiante autodidacta. No se lo que es VisualBasic.net
Yo estoy utilizando Microsoft Visual Basic 2010 Express y estoy hacien el programa en una Aplicación de Windows Forms.
Conozco la función para redondear pero en este caso da igual y lo de cint funciona bien.
No, el codigo que te di esta bien porque la variable cnt se incrementa en cada pasada del bucle en 1 y al final se pone en el label el numrro de pasadas que son la variable cnt, pero la variable numrroVeces solo se incrementa si sale 1 que seria nuestra cara, y solo sale del bucle si ha salido nuestra cara el numronde veces del textbox
Tienes razón en lo que dices pero me refiero a que el 1 salga un nº de veces seguidas = al textbox y lo que tu me estas poniendo no son seguidas me entiendes.
Ahh ok no te habia entendido bien entonces podria ser asi
If not IsNumeric(Textbox2.Text) then exit sub
Dim numeroVecesTotal as integer
Dim numeroVeces as integer
Dim a as integer
Dim cnt asinteger
numeroVecesTotal = textbox2.text
Do while not numeroVeces = numeroVecesTotal
a = CInt(Rnd)
if a = 1 then
numeroVeces = numeroVeces + 1
else
numeroveces = 0
end if
cnt = cnt + 1
Loop
Label6.text = cnt
[/quote]
Vale, ahora sí.
Muchísimas gracias noele1995
Me he dado cuenta de que cuando ingreso en el programa "20" el resultado siempre es el mismo y no lo entiendo por que sale.
Sale estos números en orden como están y luego cuando ya ha salido el último salen los que tienen "^" siempre y no lo entiendo ya que es un programa de azar.
714714
1503551
268374 ^
1224009 ^
4783897 ^
1262185 ^
2050540 ^
3896331 ^
1788329 ^
1503551 ^
¿Alguien me puede ayudar a solucionarlo y a ver por qué pasa?
Prueba a poner justo en la primera accion dentro del bucleRandomize(timer)
O no estoy seguro si tambien se podria poner cambiando la asignacionde a poniendoa = CInt(Rnd(timer))
prueba esas dos formas
Saludos, Noele1995
No entiendo para que es lo de timer.
Realmente la forma de generar numeros aleatoris es llegar a un numero a partir de otro numero por medio de operaciones. Cuando le pones timer le estas poniendo que lo genere en base a la hora, que siempre cambia.
Saludos, Noele1995.
Mirate esto y mirate el codigo que deja al final, pero lee todo para que entiendas lo de la semilla y eso.
http://www.elguille.info/net/dotnet/random_next.aspx
Tengo otra pregunta
Yo hice este programa en el cual tú ingresas un nº en un textbox y te devuelve en un label el nº de veces que ha salido el 1 aleatoriamente y en otro label el nº de veces que ha salido el 2 aleatoriamente (nota: los dos label sumados tienen que dar el textbox) y en otro label sale la diferencia de los otros labels anteriores.
Private Sub Button6_Click_1(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button6.Click
If Not IsNumeric(TextBox4.Text) Then Exit Sub
Label16.Text = ""
Label7.Text = ""
Label5.Text = ""
If Label16.Text = "" Then Label16.Text = 0
If Label7.Text = "" Then Label7.Text = 0
Dim a As Double
Dim b As Integer = TextBox4.Text
For b = 1 To b
a = Rnd()
If a < 0.5 Then Label16.Text = Label16.Text + 1
Next b
Label7.Text = TextBox4.Text - Label16.Text
If Label5.Text = "" Then Label5.Text = 0
Label5.Text = Label16.Text - Label7.Text
End Sub
Lo que quiero hacer es otro programa en el cual en un textbox ingresas un nº y haga lo mismo que en el programa anterior pero en este quiero que se repita el proceso hasta que el valor absoluto del label de la diferencia de los otros dos labels sea igual a el textbox y en un labelsolución me de el número de veces que se ha tenido que ejecutar. En este caso los dos labels y el label de la diferencia serán variables.
He intentado hacer lo que he podido pero no me sale porque cuando lo ejecuto tarda, puffff y eso no debería ser normal cuando se utilizan números pequeños.
Private Sub Button14_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button14.Click
If Not IsNumeric(TextBox6.Text) Then Exit Sub
Labelsolución.Text = ""
If Labelsolución.Text = "" Then Labelsolución.Text = 0
Dim x As Integer
Dim z As Integer
Dim g As Integer
Dim t As Integer
Do Until TextBox6.Text = t Or TextBox6.Text = t * (-1)
Dim a As Double
Dim b As Double = TextBox6.Text
For b = 1 To b
a = Rnd()
If a < 0.5 Then z = z + 1
Next b
g = TextBox6.Text - z
t = z - g
x = x + 1
Loop
Labelsolución.Text = x
End Sub
Por si no lo entendéis (seguro porque lo puse complicado):
Ejemplo:
TextBox6.Text = 4
Entonces:
z = 0
g = 4
t = -4
Valor absoluto de -4 = 4
TextBox6.Text = valor absoluto de t
y como solamente he necesitado ejecutarlo 1ª vez entonces en el label solución debe poner "1"
Ejemplo 2:
TextBox6.Text = 5
Entonces:
z = 3
g = 2
t = 1
Se repite porque val abs de t no es 5 y a labelsolución se le suma 1 por haber ejecutado el proceso una vez.
z = 5
g =0
t = 5
Como val abs de t es 5 y TextBox6.Text = 5 ya he acabado porque son iguales entonces a labelsolución se le suma otro
Entonces labelsolución tiene que poner 2 porque ha tenido que ejecutarse dos veces.
Espero que lo hayan entendido y gracias de antemano.
Muchas gracias $Edu$ no sabía eso la pagina que me diste y lo explica muy bien.