Generering af tilfældige tal er vigtig for mange opgaver. Disse omfatter spiludvikling, kryptografi og dataanalyse. Tilfældige værdier giver mulighed for distinkte resultater med et element af variabilitet og uforudsigelighed.
Go giver to pakker til generering af tilfældige værdier i standardbiblioteket: matematik/rand og krypto/rand. Det matematik/rand pakken er primært til matematiske operationer. Det krypto/rand pakke håndterer kryptografisk sikre operationer.
Rand-pakkerne
Det matematik/rand pakke giver en fleksibel metode til generere tilfældige tal. Den implementerer en række pseudo-tilfældige talgenerationer. Pakken kan generere et tilfældigt tal med forskellige distributioner og bruge frø til at styre den tilfældige sekvens. Det kan også generere tilfældige tal samtidigt eller parallelt.
Det krypto/rand pakken implementerer en kryptografisk sikker tilfældig talgenerator. Det inkluderer funktionalitet til at generere tilfældige primtal med høj sandsynlighed.
Da disse pakker har samme navn, skal du bruge aliaser, hvis du vil bruge begge i et enkelt program, for eksempel:
importere (
crand "krypto/rand"
mrand "matematik/rand"
)
Generering af tilfældige heltal i Go
Du kan bruge matematik/randsIntn funktion til at generere tilfældige tal i et område.
importere (
"fmt"
"matematik/rand"
"tid"
)funcvigtigste() {
rand. Frø (tid. Now().UnixNano())// Intn genererer et tilfældigt heltal mellem 0 og 100
// (ikke inklusive 100)
randomInt := rand. Intn(100)
fmt. Println (randomInt)
}
Denne kode overfører den aktuelle tid til Frø fungere. Den initialiserer standardgeneratoren for tilfældige tal for pseudo-tilfældighed.
Det Intn funktionen af rand-pakken genererer et tilfældigt tal mellem et specificeret område, i dette tilfælde 0 til 100.
Generer tilfældige floating-point-tal
Du kan generere tilfældige flydende decimaltal med Float32 og Flyd 64 funktioner. De returnerer henholdsvis 32-bit og 64-bit flydende kommatal.
Sådan kan du generere tilfældige 64-bit flydende decimaltal i Go.
importere (
"fmt"
"matematik/rand"
"tid"
)funcvigtigste() {
rand. Frø (tid. Now().UnixNano())// generere en tilfældig float64 mellem 0,0 og 1,0
randomFloat := rand. Float64()
fmt. Println (randomFloat)
}
Processen med at generere 32-bit flydende decimaltal er den samme som at generere tilfældige 64-bit flydende deal.
Generering af kryptografisk sikre tilfældige numre på vej
Du kan bruge Int funktion af krypto/rand pakke til at generere et kryptografisk sikkert tilfældigt tal. Det Int funktionen tager i en læserinstans og et maksimalt antal for grænsen.
importere (
"krypto/rand"
"fmt"
"matematik/stor"
)funcvigtigste() {
// Opret en stor. Int med den maksimale værdi for det ønskede område
max := stor. NewInt(100000000)
// Generer en tilfældig stor. Int
// Det første argument er en læser, der returnerer tilfældige tal
// Det andet argument er den maksimale værdi (ikke inklusive)
randInt, fejl := rand. Int (rand. Læser, max)
hvis fejl!= nul {
fmt. Println("Fejl ved generering af tilfældigt tal:", fejl)
Vend tilbage
}
fmt. Println("Tilfældigt tal:", randInt)
}
Det max variabel definerer den maksimale værdi for det tilfældige tal ved hjælp af NewInt funktion af matematik/stort pakke. Det Int funktion returnerer det tilfældige heltal og en fejl til håndtering.
Generering af kryptografisk sikre tilfældige værdier
Det krypto/rand pakken giver ikke indbygget funktionalitet til at generere kryptografisk sikker tilfældige strenge. Alligevel kan du arbejde dig omkring dette ved at bruge Læs fungere.
importere (
"krypto/rand"
"fmt"
)funckryptoRandom(strengChars snor, værdiLængde int32)snor {
bytesSlice := lave([]byte, valueLength)
_, fejl := rand. Læs (bytesSlice)hvis fejl!= nul {
Vend tilbage"Der opstod en fejl ved læsning fra byteudsnittet"
}til pos, værdi := rækkevidde bytesSlice {
randomiser := værdi % byte(len(stringChars))
bytesSlice[pos] = strengChars[randomiser]
}Vend tilbagesnor(bytesSlice)
}
funcvigtigste() {
fmt. Println (cryptoRandom("Pneumonoultram" +
"ikroskopisk silicovolcanoconiosis", 10))
}
Det kryptoRandom Funktionen ovenfor tager en streng ind for at generere en tilfældig streng fra. Det tager også en længde - et 32-bit heltal - og returnerer en streng.
I den kryptoRandom funktion, den bytesSlice variabel er et stykke af den påkrævede strenglængde. For-range-løkken krydser byte-skiven og returnerer og henter modulet af elementerne i skiven og længden af strengen i bytes. Det opdaterer indekset for byte-udsnittet med modulo-værdiindekset for strengen.
Endelig, den kryptoRandom funktion returnerer strengformatet for byte-udsnittet.
Du kan generere UUID'er med Go
Generering af tilfældige værdier er praktisk til en bred vifte af brugssager. Hvis du har brug for mange tilfældige, unikke værdier, kan du bruge UUID'er.
UUID'er (Universally Unique Identifiers) sikrer global unikhed for identifikatorer. Du kan bruge dem til at skelne mellem ressourcer på tværs af systemer og samtidig undgå navnekonflikter.
Der er mange pakker, du kan bruge til at generere UUID'er i Go. Du kan bruge os-pakken til at kalde uuid kommando på dit operativsystem, ty til Googles UUID-pakke, eller brug gouuid-pakken til at generere UUID'er.