none
Crear un array y llenarlo con números aleatorios sin que se repitan en VB.NET RRS feed

  • Pregunta

  • Muy buenas a todos, tengo un problema con este problema y agradeciera mucho que me pudieran ayudar. Puedo crear el array con los aleatorios pero estos se repiten. 
    lunes, 11 de enero de 2016 17:53

Respuestas

  • La forma más eficiente es usando un HashSet o un diccionario para comprobar de forma rápida si un número ya lo tenemos, y en tal caso generar otro:

    El siguiente código es de una aplicación de consola que genera 100 000 números aleatorios y los guarda en un archivo:

    Imports System.IO
    
    Module Module1
    
        Sub Main()
            Dim numbersFilePath As String = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "RandomNumbers.txt")
            Using writer As New StreamWriter(numbersFilePath, False, Text.Encoding.Default)
                For Each number In GenerateUniqueRandomNumbers(0, Int32.MaxValue, 100000)
                    writer.WriteLine(number)
                Next
            End Using
        End Sub
    
        Function GenerateUniqueRandomNumbers(minValue As Integer, maxValue As Integer, totalNumbersToGenerate As Integer) As HashSet(Of Integer)
            If (maxValue < minValue) Then
                Throw New ArgumentException("maxValue must be greater or equals than minValue")
            End If
            Dim result As New HashSet(Of Integer)
            Dim rnd As New Random()
            While result.Count < totalNumbersToGenerate
                Dim number As Integer = rnd.Next(minValue, maxValue)
                If Not result.Contains(number) Then
                    result.Add(number)
                End If
            End While
            Return result
        End Function
    
    End Module
    

    miércoles, 13 de enero de 2016 8:29

Todas las respuestas

  • Hola Carlos,

    ¿estamos hablando de números enteros? ¿de algún rango determinado?


    Píldoras .NET
    Artículos, tutoriales y ejemplos de código .NET

    Píldoras JS
    Artículos, tutoriales y ejemplos de código JavaScript, HTML5, CSS3, ...

    lunes, 11 de enero de 2016 17:57
  • Hola:
    En un Form con 1 Button, copia y pega el siguiente codigo

    Public Class Form1
        Private miArray(9) As Integer

        Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
            Dim lbSeguir As Boolean = True
            Dim Aleatorio As New Random
            Dim liNumero As Integer
            Dim liAsignados As Integer = 0
            While lbSeguir = True
                liNumero = Aleatorio.Next(1, 11)
                If miArray.Contains(liNumero) = False Then   'Si NO esta el valor en el array
                    miArray(liNumero - 1) = liNumero
                    liAsignados += 1
                    If liAsignados = miArray.Length Then
                        lbSeguir = False
                    End If
                End If
            End While
            MessageBox.Show("ARRAY COMPLETO")
        End Sub
    End Class

    Un saludo desde Bilbo
    Carlos

    martes, 12 de enero de 2016 10:03
  • Puedes darnos más información sobre tu problema? Algo de código? Gracias

    Si se solucionó tu consulta no olvides marcar la respuesta. Si te ayudó, vótala como útil. Saludos

    martes, 12 de enero de 2016 16:24
  • La forma más eficiente es usando un HashSet o un diccionario para comprobar de forma rápida si un número ya lo tenemos, y en tal caso generar otro:

    El siguiente código es de una aplicación de consola que genera 100 000 números aleatorios y los guarda en un archivo:

    Imports System.IO
    
    Module Module1
    
        Sub Main()
            Dim numbersFilePath As String = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "RandomNumbers.txt")
            Using writer As New StreamWriter(numbersFilePath, False, Text.Encoding.Default)
                For Each number In GenerateUniqueRandomNumbers(0, Int32.MaxValue, 100000)
                    writer.WriteLine(number)
                Next
            End Using
        End Sub
    
        Function GenerateUniqueRandomNumbers(minValue As Integer, maxValue As Integer, totalNumbersToGenerate As Integer) As HashSet(Of Integer)
            If (maxValue < minValue) Then
                Throw New ArgumentException("maxValue must be greater or equals than minValue")
            End If
            Dim result As New HashSet(Of Integer)
            Dim rnd As New Random()
            While result.Count < totalNumbersToGenerate
                Dim number As Integer = rnd.Next(minValue, maxValue)
                If Not result.Contains(number) Then
                    result.Add(number)
                End If
            End While
            Return result
        End Function
    
    End Module
    

    miércoles, 13 de enero de 2016 8:29