¿Cómo generar una array de números aleatorios únicos en Golang?

A veces necesitamos algunos números aleatorios pero no repetidos, generalmente los números aleatorios son pseudoaleatorios y definitivamente hay una posibilidad de repetición en ellos. Digamos que tenemos un rango de números y queremos tener n número de elementos de forma barajada entre ese rango.

Usando rand.Perm

Simplemente comenzaremos creando un archivo con cualquier nombre apropiado y con una extensión .go. Usaremos el módulo matemático aleatorio en Golang, por lo que debemos importar ese módulo.

Go

// Go program generating an array of unique random numbers
package main
 
import (
    "fmt"
    "math/rand"
)
 
func main() {
    permutation := rand.Perm(5)
 
    fmt.Println(permutation)
}

Producción:

[0 4 2 3 1]

Como podemos ver, da una permutación para organizar cinco objetos que son aleatorios a la vez, pero no cambia el orden después de cada ejecución o iteración. Así que no estamos generando completamente una lista aleatoria, necesitamos tener un orden de permutación diferente cada vez. Entonces, para hacer eso, usamos el módulo aleatorio con el módulo de tiempo. Necesitamos generar una semilla diferente para que la función de permutación cambie el orden. Por defecto, la semilla sigue siendo la misma, pero si agregamos la hora actual como semilla, produce una semilla diferente y, a su vez, genera el orden correspondiente. 

Para agregar ese nivel de aleatoriedad, necesitamos usar el módulo de tiempo, dentro de eso necesitamos obtener la hora actual, que se puede obtener usando time.Now(), esto da la hora actual en el formato de fecha y hora. Este formato no se puede usar como semilla, por lo que lo convertimos a segundos usando la función Unix. La función Unix da los segundos desde el 1 de enero de 1970. Incluso puede usar UnixNano, UnixMicro o UnixMill. Estos solo devuelven los segundos de Unix en nano, micro y milisegundos. 

rand.Seed(tiempo.Ahora().Unix())

Entonces, si agregamos el siguiente comando al script, la función de permutación generará el orden aleatoriamente.

Go

// Go program generating an array of unique random numbers
package main
 
import (
    "fmt"
    "math/rand"
    "time"
)
 
func main() {
    rand.Seed(time.Now().Unix())
    permutation := rand.Perm(5)
 
    fmt.Println(permutation)
}

Producción:

[4 0 1 2 3]

Definición de un rango de números en la lista

Para definir los rangos, podemos ingresarlos del usuario o simplemente establecerlos en un valor fijo. Sin embargo, la función de permutación no permitirá ingresar el rango mínimo y máximo, simplemente devuelve n números en orden de rango de 0 a n-1 siempre que n sea un parámetro de la función. 

Go

// Go program to define a range for numbers in the list
package main
 
import (
    "fmt"
    "math/rand"
    "time"
)
 
func main() {
    rand.Seed(time.Now().Unix())
    min := 3
    max := 7
    permutation := rand.Perm(max - min + 1)
 
    fmt.Println(permutation)
}

Producción:

[3 4 0 1 2]

Usaremos una variable min y max para establecer el límite mínimo y máximo para generar los números. Entonces, para generar los números entre el rango mínimo y máximo proporcionado, podemos pasar max-min+1 a la función, ya que generaría los números requeridos. Estamos agregando uno porque el rango es inclusivo. Por ejemplo, aquí el valor mínimo es 3 y el valor máximo es 7, claramente tenemos 5 valores para elegir, es decir, 3,4,5,6,7, por lo que la fórmula se ajusta perfectamente a max-min+1. Entonces, tenemos 5 números y le damos el número 5 como parámetro a la función de permutación y representará los números 0 a 5-1 en orden aleatorio, es decir, [0 1 2 3 4] en orden aleatorio.

Para probar esto, podemos agregar la entrada del usuario para min-max y ver que la función de permutación muestra los números.

Go

// Go program to take user input for min-max and see the
// permutation function display the numbers
package main
 
import (
    "fmt"
    "math/rand"
    "time"
)
 
func main() {
    rand.Seed(time.Now().Unix())
    var min int
    var max int
    fmt.Print("Enter the min number: ")
    fmt.Scan(&min)
    fmt.Print("Enter the max number: ")
    fmt.Scan(&max)
    permutation := rand.Perm(max - min + 1)
 
    fmt.Println(permutation)
}

Producción:

Entonces, podemos ver que la cantidad de elementos entre el rango se organiza con la ayuda de la función de permutación. No, veremos cómo tener estos valores realmente entre el rango mínimo y máximo. 

Crear una array con permutación de min a max

Para obtener el valor del elemento entre el rango mínimo y máximo, simplemente necesitamos agregar el límite mínimo a todos los elementos. Eventualmente se acomodará en el rango dado.

for i := permutación de rango {

lista_aleatoria[i] += min

}

Entonces, esto básicamente cambia cada elemento por el valor mínimo para que automáticamente los números entren en el rango entre (mínimo, máximo). Después de agregar eso en el script, finalmente se convierte en lo siguiente:

Go

// Go program for creating an array with permutation from min to max
package main
 
import (
    "fmt"
    "math/rand"
    "time"
)
 
func main() {
    rand.Seed(time.Now().Unix())
    var min int
    var max int
    fmt.Print("Enter the min number: ")
    fmt.Scan(&min)
    fmt.Print("Enter the max number: ")
    fmt.Scan(&max)
    random_list := rand.Perm(max - min + 1)
 
    for i := range random_list {
        random_list[i] += min
    }
 
    fmt.Println(random_list)
    /*
    for _, num := range random_list {
        fmt.Println(num)
    }
    */
}

El código en los comentarios básicamente itera sobre la array generada, es decir, la lista aleatoria única, e imprime los elementos uno por uno.

 

Publicación traducida automáticamente

Artículo escrito por meetgor y traducido por Barcelona Geeks. The original can be accessed here. Licence: CCBY-SA

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *