Generering av slumptal är viktigt för många uppgifter. Dessa inkluderar spelutveckling, kryptografi och dataanalys. Slumpmässiga värden tillåter distinkta utfall med ett inslag av variabilitet och oförutsägbarhet.
Go tillhandahåller två paket för att generera slumpmässiga värden i standardbiblioteket: matte/rand och krypto/rand. De matte/rand Paketet är främst för matematiska operationer. De krypto/rand paketet hanterar kryptografiskt säkra operationer.
Rand-paketen
De matte/rand paket ger en flexibel metod för genererar slumpmässiga tal. Den implementerar en mängd olika pseudo-slumptalsgenerationer. Paketet kan generera ett slumptal med olika distributioner och använda frön för att styra den slumpmässiga sekvensen. Den kan också generera slumpmässiga tal samtidigt eller parallellt.
De krypto/rand paket implementerar en kryptografiskt säker slumptalsgenerator. Den innehåller funktionalitet för att generera slumpmässiga primtal med hög sannolikhet.
Eftersom dessa paket har samma namn, måste du använda alias om du vill använda båda i ett enda program, till exempel:
importera (
crand "krypto/rand"
Herr och "matte/rand"
)
Generera slumpmässiga heltal i Go
Du kan använda matte/randsIntn funktion för att generera slumptal i ett intervall.
importera (
"fmt"
"matte/rand"
"tid"
)funchuvud() {
rand. Frö (tid. Now().UnixNano())// Intn genererar ett slumpmässigt heltal mellan 0 och 100
// (exklusive 100)
randomInt := rand. Intn(100)
fmt. Println (randomInt)
}
Denna kod skickar den aktuella tiden till Utsäde fungera. Den initierar standardgeneratorn för slumptal för pseudo-slumpmässighet.
De Intn funktionen för paketet rand genererar ett slumptal mellan ett specificerat område, i det här fallet, 0 till 100.
Generera slumpmässiga flyttalstal
Du kan generera slumpmässiga flyttal med Float32 och Float64 funktioner. De returnerar 32-bitars respektive 64-bitars flyttal.
Så här kan du generera slumpmässiga 64-bitars flyttal i Go.
importera (
"fmt"
"matte/rand"
"tid"
)funchuvud() {
rand. Frö (tid. Now().UnixNano())// generera en slumpmässig float64 mellan 0,0 och 1,0
randomFloat := rand. Float64()
fmt. Println (randomFloat)
}
Processen att generera 32-bitars flyttal är densamma som att generera slumpmässiga 64-bitars flyttal.
Generera kryptografiskt säkra slumptal i farten
Du kan använda Int funktion av krypto/rand paket för att generera ett kryptografiskt säkert slumptal. De Int funktionen tar i en läsarinstans och ett maximalt antal för gränsen.
importera (
"krypto/rand"
"fmt"
"matte/stor"
)funchuvud() {
// Skapa en stor. Int med maxvärdet för det önskade intervallet
max := stor. NewInt(100000000)
// Skapa en slumpmässig stor. Int
// Det första argumentet är en läsare som returnerar slumptal
// Det andra argumentet är det maximala värdet (ej inklusive)
randInt, err := rand. Int (rand. Läsare, max)
om fel!= noll {
fmt. Println("Fel vid generering av slumptal:", fel)
lämna tillbaka
}
fmt. Println("Slumpmässigt nummer:", randInt)
}
De max variabel definierar det maximala värdet för slumptalet med hjälp av NewInt funktion av matte/stor paket. De Int funktion returnerar det slumpmässiga heltal och ett fel för hantering.
Generera kryptografiskt säkra slumpmässiga värden
De krypto/rand paketet tillhandahåller inte inbyggd funktionalitet att generera kryptografiskt säkert slumpmässiga strängar. Ändå kan du arbeta dig runt detta med hjälp av Läsa fungera.
importera (
"krypto/rand"
"fmt"
)funckryptoRandom(stringChars sträng, värdeLängd int32)sträng {
bytesSlice := göra([]byte, valueLength)
_, fel := rand. Läs (bytesSlice)om fel!= noll {
lämna tillbaka"Det uppstod ett fel vid läsning från bytesegmentet"
}för pos, värde := räckvidd bytesSlice {
randomisera := värde % byte(len(stringChars))
bytesSlice[pos] = stringChars[randomisera]
}lämna tillbakasträng(bytesSlice)
}
funchuvud() {
fmt. Println (cryptoRandom("Pneumonoultram" +
"ikroskopisk silikovulkanokonios", 10))
}
De kryptoRandom Funktionen ovan tar in en sträng att generera en slumpmässig sträng från. Det tar också en längd – ett 32-bitars heltal – och returnerar en sträng.
I den kryptoRandom funktion, den bytesSlice variabel är en del av den nödvändiga stränglängden. For-range-loopen korsar bytesegmentet och returnerar och hämtar modulen för segmentens element och längden på strängen i byte. Den uppdaterar indexet för bytesegmentet med modulovärdesindexet för strängen.
Slutligen, den kryptoRandom funktion returnerar strängformatet för bytesegmentet.
Du kan generera UUID med Go
Att generera slumpmässiga värden är praktiskt för ett brett spektrum av användningsfall. Om du behöver många slumpmässiga, unika värden kan du använda UUID.
UUID (Universally Unique Identifiers) säkerställer global unikhet för identifierare. Du kan använda dem för att skilja mellan resurser över system samtidigt som du undviker namnkonflikter.
Det finns många paket du kan använda för att generera UUID i Go. Du kan använda OS-paketet för att anropa uuid kommandot på ditt operativsystem, ta till Googles UUID-paket eller använd gouuid-paketet för att generera UUID.