Visual Basic.NET - Generar Números aleatorios entre un rango y pasarlo a columnas de un Datagridview

 
Vista:
Imágen de perfil de Andrés
Val: 48
Ha aumentado 1 puesto en Visual Basic.NET (en relación al último mes)
Gráfica de Visual Basic.NET

Generar Números aleatorios entre un rango y pasarlo a columnas de un Datagridview

Publicado por Andrés (27 intervenciones) el 30/09/2018 21:46:46
Buenas tardes, quisiera saber como generar números aleatorios en rango, ordenarlos de menor a mayor y de esta manera pasarlos a una columna "a" sin que se repitan. Una vez que tenga esa columna "a" con los números generados, pasarlos a una columna "b" desde el segundo numero para de esta manera establecer un intervalo de números entre la columna "a" y "b". Lo ideal es pasar esto a un DataGridView y poder continuar con unos cálculos en un tema que se llama Integración numérica.

Este es un ejemplo en Excel en el que utilice números entre 1 y 2, donde por decirlo así "2" es mi límite superior y 1 mi límite inferior:

21

Les agradecería si me pudieran ayudar...
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder
sin imagen de perfil
Val: 46
Ha mantenido su posición en Visual Basic.NET (en relación al último mes)
Gráfica de Visual Basic.NET

Generar Números aleatorios entre un rango y pasarlo a columnas de un Datagridview

Publicado por Diego (19 intervenciones) el 01/10/2018 01:13:57
Hola. Te lo dejo muy básico, se puede mejorar seguramente.
En un form pone un boton y un datagridview con dos columnas, en mi caso llamado DG_numeros

en el codigo del boton poné:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    Dim numero As Decimal
    Dim arr(8) As Decimal
    Dim Random As New Random()
    For i As Integer = 0 To 8 Step 1
        numero = Random.Next(1000, 2000) / 1000
        arr(i) = numero
    Next
    Array.Sort(arr)
 
    For i As Integer = 0 To 9 Step 1
        If i = 0 Then
            DG_numeros.Rows.Add(1, arr(0))
        ElseIf i >= 1 And i <= 8 Then
            DG_numeros.Rows.Add(arr(i - 1), arr(i))
        Else
            DG_numeros.Rows.Add(arr(i - 1), 2)
        End If
    Next
 
End Sub

Te dejo a vos el proceso para que no repita los numeros...probe unas 20 veces y nunca me pasó...pero puede pasar

Saludos

PD: no puse ninguna aclaración, aunque es bastante claro, pero cualquier cosa no dudes en consultarme.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
2
Comentar
Imágen de perfil de Andrés
Val: 48
Ha aumentado 1 puesto en Visual Basic.NET (en relación al último mes)
Gráfica de Visual Basic.NET

Generar Números aleatorios entre un rango y pasarlo a columnas de un Datagridview

Publicado por Andrés (27 intervenciones) el 01/10/2018 02:37:47
Muchisimas gracias Diego, probare y te comentare. Cualquier cosa te molesto para como dejar números fijos en un datagridview.
Gracias de antemano!!! +10
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Imágen de perfil de Andrés
Val: 48
Ha aumentado 1 puesto en Visual Basic.NET (en relación al último mes)
Gráfica de Visual Basic.NET

Generar Números aleatorios entre un rango y pasarlo a columnas de un Datagridview

Publicado por Andrés (27 intervenciones) el 01/10/2018 05:40:19
Diego, hola de nuevo...

Tu aporte a sido de mucho ayuda, quisiera saber si me puedes ayudar en lo siguiente...

He logrado crear un código con la ayuda de Internet para que el margen de que se repita los números sea muy poco (Creería en un 99% que no se repiten por la cantidad de decimales). Tengo el siguiente código y quisiera saber como pasar los valores de la columna "a" a la columna "b", y de igual manera dejar fijos el primer valor de la columna "a" y columna "b" que es lo que el usuario determina (Intervalo). Es decir hacer lo mismo que hiciste anteriormente pero en el siguiente caso.

Te vas a dar cuenta que cargo el DataGridView con los valores que se van guardando en la clase Fila mediante DataSource. Además del DataGridView utilizo un ListBox para mostrar los numeros con todos los decimales.


Te agradecería mucho Diego, necesito entregar esto para la U lo mas antes posible...

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
Public Class Form1
 
    Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
        Dim tabla As New List(Of Fila)
        Dim i, valorA, nuevovalorA, valorB, NVeces As Double
 
        valorA = Integer.Parse(InputBox("Ingrese el límite de Integración de 'a'", "Método del Trapecio", "Valor de 'a'", 100, 100))
        valorB = Integer.Parse(InputBox("Ingrese el límite de Integración de 'b'", "Método del Trapecio", "Valor de 'b'", 100, 100))
        NVeces = Integer.Parse(InputBox("Ingrese el valor de N Veces", "Método del Trapecio", "Valor de 'N Veces'", 100, 100))
 
        Dim arrayNumeros(NVeces) As Double
 
        Dim repetido As Boolean
        Randomize()
 
        For i = 1 To NVeces 'genero numeros aleatorios NVeces
            repetido = False
 
            nuevovalorA = (valorB - valorA) * Rnd() + valorA 'genero numeros aleatorios entre a, b 
            'arrayNumeros(i - 1) = nuevovalorA
 
            While repetido = False
                For j = 0 To i - 1 'verificar cada numero del arreglo para buscar repetido 
                    If i > 1 Then
                        If nuevovalorA = arrayNumeros(j) Then
                            repetido = False
                            nuevovalorA = (valorB - valorA) * Rnd() + valorA 'genero numeros aleatorios entre 0 y 9el intervalo a, b 
                            j = -1
                        ElseIf j = i - 1 Then
                            'arrayNumeros(i - 1) = nuevovalorA
                            repetido = True
                        End If
                    Else
                        repetido = True
                    End If
                Next j
            End While
 
            arrayNumeros(i - 1) = nuevovalorA
 
        Next i
 
        For i = 0 To UBound(arrayNumeros) - 1
 
            Dim fila As New Fila
 
            Array.Sort(arrayNumeros)
 
            ListBox1.Items.Add(arrayNumeros(i))
 
            fila.n = i + 1
            fila.a = (arrayNumeros(i))
 
            'fila.b = DataGridView1.Rows.Add(arrayNumeros(i - 1), valorB)
 
            'Delta x: b-a/N
            Dim delX As Double = (fila.b - fila.a)
            fila.deltaX = delX
 
            'Nuestras constantes asignadas fueron: para c = 4 y d = 7
            Dim raiz1 As Double = Math.Sqrt(4 + 7 * fila.a ^ 4)
            fila.raizA = raiz1
 
            Dim raiz2 As Double = Math.Sqrt(4 + 7 * fila.b ^ 4)
            fila.raizB = raiz2
 
            'Calcular Area: (a+b/2) * deltaX  
            Dim area As Double = ((fila.raizA + fila.raizB) / 2) * fila.deltaX
            fila.Area = area
 
            tabla.Add(fila)
        Next i
 
        DataGridView1.DataSource = tabla
        DataGridView1.Columns("a").DefaultCellStyle.Format = "N4"
        DataGridView1.Columns("b").DefaultCellStyle.Format = "N4"
        DataGridView1.Columns("deltaX").DefaultCellStyle.Format = "N4"
        DataGridView1.Columns("deltaX").HeaderText = "DeltaX"
        DataGridView1.Columns("raizA").DefaultCellStyle.Format = "N4"
        DataGridView1.Columns("raizA").HeaderText = "f(a)"
        DataGridView1.Columns("raizB").DefaultCellStyle.Format = "N4"
        DataGridView1.Columns("raizB").HeaderText = "f(b)"
        DataGridView1.Columns("Area").DefaultCellStyle.Format = "N4"
        DataGridView1.Columns("Area").HeaderText = "Area"
    End Sub
 
    Class Fila
        Public Property n() As Integer
        Public Property a() As Double
        Public Property b() As Double
        Public Property deltaX() As Double
        Public Property raizA() As Double
        Public Property raizB() As Double
        Public Property Area() As Double
    End Class
 
End Class
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
sin imagen de perfil
Val: 46
Ha mantenido su posición en Visual Basic.NET (en relación al último mes)
Gráfica de Visual Basic.NET

Generar Números aleatorios entre un rango y pasarlo a columnas de un Datagridview

Publicado por Diego (19 intervenciones) el 01/10/2018 14:37:33
Hola Andrés, a ver si entiendo, probé tu código, lo que necesitas es que cómo habías comentado al comienzo del post, el número inicial (limite inferior A) te quede en la posicion A:1, EN B:1 el primer numero aleatorio....en A:2 repetir el primer numero aleatorio y en B:2 el segundo número aleatorio....asi N veces hasta la ultima posicion donde en A:n te quedaría el último numero aleatorio y en B:n el número final(límite superior B)....es así o entendí cualquier cosa ? Porque veo que funciona pero la columna B está vacía y la primer fila del datagrid te queda en cero. Y en el final te falta el límite superior.

Saludos
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
1
Comentar
sin imagen de perfil
Val: 46
Ha mantenido su posición en Visual Basic.NET (en relación al último mes)
Gráfica de Visual Basic.NET

Generar Números aleatorios entre un rango y pasarlo a columnas de un Datagridview

Publicado por Diego (19 intervenciones) el 01/10/2018 15:03:00
Creo que lo que buscás es así, hice algunas pequeñas modificaciones, te paso todo el código

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
Public Class Form1
    Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
        Dim tabla As New List(Of Fila)
        Dim i, valorA, nuevovalorA, valorB, NVeces As Double
 
        valorA = Integer.Parse(InputBox("Ingrese el límite de Integración de 'a'", "Método del Trapecio", "Valor de 'a'", 100, 100))
        valorB = Integer.Parse(InputBox("Ingrese el límite de Integración de 'b'", "Método del Trapecio", "Valor de 'b'", 100, 100))
        NVeces = Integer.Parse(InputBox("Ingrese el valor de N Veces", "Método del Trapecio", "Valor de 'N Veces'", 100, 100))
 
        Dim arrayNumeros(NVeces) As Double
 
        Dim repetido As Boolean
        Randomize()
 
        For i = 1 To NVeces 'genero numeros aleatorios NVeces
            repetido = False
 
            nuevovalorA = (valorB - valorA) * Rnd() + valorA 'genero numeros aleatorios entre a, b 
            'arrayNumeros(i - 1) = nuevovalorA
 
            While repetido = False
                For j = 0 To i - 1 'verificar cada numero del arreglo para buscar repetido 
                    If i > 1 Then
                        If nuevovalorA = arrayNumeros(j) Then
                            repetido = False
                            nuevovalorA = (valorB - valorA) * Rnd() + valorA 'genero numeros aleatorios entre 0 y 9el intervalo a, b 
                            j = -1
                        ElseIf j = i - 1 Then
                            'arrayNumeros(i - 1) = nuevovalorA
                            repetido = True
                        End If
                    Else
                        repetido = True
                    End If
                Next j
            End While
 
            arrayNumeros(i - 1) = nuevovalorA
 
        Next i
 
        Array.Sort(arrayNumeros)
 
        Dim delX As Double
        Dim raiz1 As Double
        Dim raiz2 As Double
        Dim area As Double
        Dim fila As Fila
 
        For i = 0 To UBound(arrayNumeros) - 1
 
            fila = New Fila
 
            ListBox1.Items.Add(arrayNumeros(i))
 
            fila.n = i + 1
 
            If i = 0 Then
                fila.a = (valorA)
                fila.b = (arrayNumeros(i + 1))
            ElseIf i > 0 And i < NVeces - 1 Then
                fila.a = (arrayNumeros(i))
                fila.b = (arrayNumeros(i + 1))
            Else
                fila.a = (arrayNumeros(i))
                fila.b = (valorB)
            End If
 
 
            delX = (fila.b - fila.a)
            fila.deltaX = delX
 
            raiz1 = Math.Sqrt(4 + 7 * fila.a ^ 4)
            fila.raizA = raiz1
 
            raiz2 = Math.Sqrt(4 + 7 * fila.b ^ 4)
            fila.raizB = raiz2
 
            area = ((fila.raizA + fila.raizB) / 2) * fila.deltaX
            fila.Area = area
 
            tabla.Add(fila)
        Next i
 
        DataGridView1.DataSource = tabla
        DataGridView1.Columns("a").DefaultCellStyle.Format = "N4"
        DataGridView1.Columns("b").DefaultCellStyle.Format = "N4"
        DataGridView1.Columns("deltaX").DefaultCellStyle.Format = "N4"
        DataGridView1.Columns("deltaX").HeaderText = "DeltaX"
        DataGridView1.Columns("raizA").DefaultCellStyle.Format = "N4"
        DataGridView1.Columns("raizA").HeaderText = "f(a)"
        DataGridView1.Columns("raizB").DefaultCellStyle.Format = "N4"
        DataGridView1.Columns("raizB").HeaderText = "f(b)"
        DataGridView1.Columns("Area").DefaultCellStyle.Format = "N4"
        DataGridView1.Columns("Area").HeaderText = "Area"
    End Sub
 
    Class Fila
        Public Property n() As Integer
        Public Property a() As Double
        Public Property b() As Double
        Public Property deltaX() As Double
        Public Property raizA() As Double
        Public Property raizB() As Double
        Public Property Area() As Double
    End Class
End Class


Creo que es lo que necesitas, pero no estoy seguro. jejejeje

Saludos
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
2
Comentar
Imágen de perfil de Andrés
Val: 48
Ha aumentado 1 puesto en Visual Basic.NET (en relación al último mes)
Gráfica de Visual Basic.NET

Generar Números aleatorios entre un rango y pasarlo a columnas de un Datagridview

Publicado por Andrés (27 intervenciones) el 01/10/2018 17:22:10
Muchas gracias Diego de antemano, probare el código y te comento! +10!!!
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Imágen de perfil de Andrés
Val: 48
Ha aumentado 1 puesto en Visual Basic.NET (en relación al último mes)
Gráfica de Visual Basic.NET

Generar Números aleatorios entre un rango y pasarlo a columnas de un Datagridview

Publicado por Andrés (27 intervenciones) el 03/10/2018 16:50:58
Diego muchísimas gracias las modificaciones estuvieron perfectas. Quisiera saber si sabes como hacer el siguiente arreglo y este cargarlo en un nuevo DataGridView.

Esto que quiero hacer es para este mismo proyecto. Haber te explico con el código...

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
Public Class Trapecio
    Private Sub Trapecio_Load(sender As Object, e As EventArgs) Handles MyBase.Load
 
        Dim tabla, tabla2 As List(Of Fila)
        Dim valorA, valorB, NVeces, nuevovalorA, NRepeticiones, n As Double
 
        valorA = Integer.Parse(InputBox("Ingrese el límite de Integración de 'a'", "Método del Trapecio", "Valor de 'a'", 100, 100))
        valorB = Integer.Parse(InputBox("Ingrese el límite de Integración de 'b'", "Método del Trapecio", "Valor de 'b'", 100, 100))
        NVeces = Integer.Parse(InputBox("Ingrese el valor de N Veces", "Método del Trapecio", "Valor de 'N Veces'", 100, 100))
        NRepeticiones = Integer.Parse(InputBox("Ingrese el valor de Numero de Repeticiones para el programa", "Método del Trapecio", "Valor de 'N Repeticiones'", 100, 100))
 
        Dim arrayNumeros(NVeces) As Double
 
        Dim repetido As Boolean
        Randomize()
 
        For i = 1 To NVeces 'genero numeros aleatorios NVeces
            repetido = False
 
            nuevovalorA = (valorB - valorA) * Rnd() + valorA 'genero numeros aleatorios entre a, b 
            'arrayNumeros(i - 1) = nuevovalorA
 
            While repetido = False
                For j = 0 To i - 1 'verificar cada numero del arreglo para buscar repetido 
                    If i > 1 Then
                        If nuevovalorA = arrayNumeros(j) Then
                            repetido = False
                            nuevovalorA = (valorB - valorA) * Rnd() + valorA 'genero numeros aleatorios entre el intervalo a, b 
                            j = -1
                        ElseIf j = i - 1 Then
                            'arrayNumeros(i - 1) = nuevovalorA
                            repetido = True
                        End If
                    Else
                        repetido = True
                    End If
                Next j
            End While
 
            arrayNumeros(i - 1) = nuevovalorA
 
        Next i
 
        arrayNumeros(0) = valorA
        arrayNumeros(NVeces) = valorB
        Array.Sort(arrayNumeros)
 
        ' En esta linea o lazo (loop) se asigna el número de orden de cada fila
        tabla = arrayNumeros.Take(NVeces).Zip(arrayNumeros.Skip(1), Function(a, b) CalcularFila(a, b)).ToList()
 
        For k As Integer = 1 To tabla.Count
            tabla(k - 1).n = k
            ListBox1.Items.Add(arrayNumeros(k))
        Next
 
        Dim arrayRepeticiones(NRepeticiones) As Double
 
        'For r = 1 To NRepeticiones
        '    n = txtValorInt.Text
        '    arrayRepeticiones(r - 1) = n
        'Next r
 
        'tabla2 = arrayRepeticiones
        'DataGridView2.DataSource = tabla2
        'DataGridView2.Columns("Valor").DefaultCellStyle.Format = "N5"
 
 
        DataGridView1.DataSource = tabla
        DataGridView1.Columns("a").DefaultCellStyle.Format = "N5"
        DataGridView1.Columns("b").DefaultCellStyle.Format = "N5"
        DataGridView1.Columns("deltaX").DefaultCellStyle.Format = "N5"
        DataGridView1.Columns("deltaX").HeaderText = "DeltaX"
        DataGridView1.Columns("raizA").DefaultCellStyle.Format = "N4"
        DataGridView1.Columns("raizA").HeaderText = "f(a)"
        DataGridView1.Columns("raizB").DefaultCellStyle.Format = "N4"
        DataGridView1.Columns("raizB").HeaderText = "f(b)"
        DataGridView1.Columns("Area").DefaultCellStyle.Format = "N4"
        DataGridView1.Columns("Area").HeaderText = "Area"
    End Sub
 
    Private Function CalcularFila(dato1 As Double, dato2 As Double) As Fila
        Dim fila As New Fila
 
        fila.a = dato1
        fila.b = dato2
 
        fila.deltaX = dato2 - dato1
        fila.raizA = Math.Sqrt(4 + 7 * fila.a ^ 4)
        fila.raizB = Math.Sqrt(4 + 7 * fila.b ^ 4)
        fila.Area = ((fila.raizA + fila.raizB) / 2) * fila.deltaX
 
        Return fila
    End Function
 
    Class Fila
        Public Property n() As Integer
        Public Property a() As Double
        Public Property b() As Double
        Public Property deltaX() As Double
        Public Property raizA() As Double
        Public Property raizB() As Double
        Public Property Area() As Double
    End Class
 
    Private Sub btnValorInt_Click(sender As Object, e As EventArgs) Handles btnValorInt.Click
        btnSiguiente.Enabled = True
 
        Dim ValorIntegral As Double
        Dim Col1 As Integer = DataGridView1.CurrentCell.ColumnIndex
        For Each row As DataGridViewRow In DataGridView1.Rows
            ValorIntegral += Val(row.Cells(6).Value)
        Next
        txtValorInt.Text = ValorIntegral.ToString
    End Sub
 
End Class

Como te puedes dar cuenta una vez cargo todo al DataGridView1, tengo un Button y un TextBox que muestra la suma de la columna Area ( ValorIntegral += Val(row.Cells(6).Value)) como ese valor que tiene el TextBox siempre va a cambiar ya que los números con los que se genera el calculo son aleatorios, lo que quiero es hacer NRepeticiones para que el programa me recalcule varios valores y de esta manera pasarlos a un arreglo, lo que pienso que es necesario hacer un nuevo ciclo For para poder cargar el arreglo.

Diego no se si sea necesario un Button para ir cargando los valores al arreglo. Mi idea es pasarlos a un DataGridView2, ya que una vez estén esos valores NRepeticiones en esa columna del DataGridView2, Poder hacer otros cálculos!

Lo que esta comentado es lo que tenia en mente pero la verdad no se como continuar. Espero me puedas ayudar.

Nuevamente mil Gracias por tu disposición!!!
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar