Leitores como você ajudam a apoiar o MUO. Quando você faz uma compra usando links em nosso site, podemos ganhar uma comissão de afiliado. Consulte Mais informação.

A geração de números aleatórios é importante para muitas tarefas. Isso inclui desenvolvimento de jogos, criptografia e análise de dados. Valores aleatórios permitem resultados distintos com um elemento de variabilidade e imprevisibilidade.

Go fornece dois pacotes para gerar valores aleatórios na biblioteca padrão: matemática/rand e cripto/rand. O matemática/rand pacote é principalmente para operações matemáticas. O cripto/rand pacote lida com operações criptograficamente seguras.

Os pacotes rand

O matemática/rand pacote fornece um método flexível para gerando números aleatórios. Ele implementa uma variedade de gerações de números pseudo-aleatórios. O pacote pode gerar um número aleatório com diferentes distribuições e usar sementes para controlar a sequência aleatória. Ele também pode gerar números aleatórios simultaneamente ou em paralelo.

O cripto/rand O pacote implementa um gerador de números aleatórios criptograficamente seguro. Inclui funcionalidade para gerar números primos aleatórios com alta probabilidade.

Como esses pacotes têm o mesmo nome, você precisará usar aliases se quiser usar os dois em um único programa, por exemplo:

importar (
crand "cripto/rand"
Senhor e "matemática/rand"
)

Gerando inteiros aleatórios em Go

Você pode usar o matemática/rand'sIntern função para gerar números aleatórios em um intervalo.

importar (
"fmt"
"matemática/rand"
"tempo"
)

funçãoprincipal() {
rand. Semente (tempo. Agora().UnixNano())

// Intn gera um inteiro aleatório entre 0 e 100
// (não incluindo 100)
randomInt := rand. Intn(100)

fmt. Println (randomInt)
}

Este código passa a hora atual para o Semente função. Ele inicializa o gerador de números aleatórios padrão para pseudo-aleatoriedade.

O Intern A função do pacote rand gera um número aleatório entre um intervalo especificado, neste caso, de 0 a 100.

Gerar números aleatórios de ponto flutuante

Você pode gerar números aleatórios de ponto flutuante com o Float32 e Float64 funções. Eles retornam números de ponto flutuante de 32 e 64 bits, respectivamente.

Veja como você pode gerar números aleatórios de ponto flutuante de 64 bits em Go.

importar (
"fmt"
"matemática/rand"
"tempo"
)

funçãoprincipal() {
rand. Semente (tempo. Agora().UnixNano())

// gera um float64 aleatório entre 0.0 e 1.0
randomFloat := rand. Float64()

fmt. Println (randomFloat)
}

O processo de gerar números de ponto flutuante de 32 bits é o mesmo que gerar números aleatórios de ponto flutuante de 64 bits.

Gerando números aleatórios criptograficamente seguros em Go

Você pode usar o Int função do cripto/rand pacote para gerar um número aleatório criptograficamente seguro. O Int função leva em uma instância de leitor e um número máximo para o limite.

importar (
"cripto/rand"
"fmt"
"matemática/grande"
)

funçãoprincipal() {
// Crie um arquivo grande. Int com o valor máximo para o intervalo desejado
max := grande. NovoInt(100000000)

// Gera um big aleatório. Int
// O primeiro argumento é um leitor que retorna números aleatórios
// O segundo argumento é o valor máximo (não incluso)
randInt, err := rand. Int (rand. Leitor, máx.)

se erro != nada {
fmt. Imprimirln("Erro ao gerar número aleatório:", erro)
retornar
}

fmt. Imprimirln("Número aleatório:", randInt)
}

O máximo variável define o valor máximo para o número aleatório usando o NewInt função do matemática/grande pacote. O Int A função retorna o número inteiro aleatório e um erro de manipulação.

Gerando Valores Aleatórios Criptograficamente Seguros

O cripto/rand pacote não fornece funcionalidade interna para gerar criptograficamente seguro sequências aleatórias. Ainda assim, você pode contornar isso usando o Ler função.

importar (
"cripto/rand"
"fmt"
)

funçãocriptoRandom(stringChars corda, valorComprimento int32)corda {
bytesSlice := fazer([]byte, valorComprimento)
_, err := rand. Leia (bytesSlice)

se erro != nada {
retornar"Ocorreu um erro ao ler a fatia de byte"
}

para pos, valor := faixa bytes Fatia {
randomizar := valor % byte(len(stringChars))
bytesSlice[pos] = stringChars[randomize]
}

retornarcorda(bytes Fatia)
}

funçãoprincipal() {
fmt. Println (cryptoRandom("Pneumonoultram" +
"microscopicsilicovulcanoconiose", 10))
}

O criptoRandom A função acima recebe uma string para gerar uma string aleatória. Ele também usa um comprimento — um inteiro de 32 bits — e retorna uma string.

No criptoRandom função, o fatia de bytes variável é uma fatia do comprimento de string necessário. O loop for-range percorre a fatia de byte e retorna e recupera o módulo dos elementos da fatia e o comprimento da string em bytes. Ele atualiza o índice da fatia de byte com o índice de valor do módulo da string.

finalmente, o criptoRandom A função retorna o formato de string da fatia de byte.

Você pode gerar UUIDs com Go

A geração de valores aleatórios é útil para uma ampla variedade de casos de uso. Se você precisar de muitos valores aleatórios e exclusivos, poderá usar UUIDs.

UUIDs (Universally Unique Identifiers) garantem exclusividade global para identificadores. Você pode usá-los para distinguir entre recursos entre sistemas, evitando conflitos de nomenclatura.

Existem muitos pacotes que você pode usar para gerar UUIDs em Go. Você pode usar o pacote os para chamar o uuid comando em seu sistema operacional, recorra ao pacote UUID do Google ou use o pacote gouuid para gerar UUIDs.