Generování náhodných čísel je důležité pro mnoho úkolů. Patří mezi ně vývoj her, kryptografie a analýza dat. Náhodné hodnoty umožňují odlišné výsledky s prvkem variability a nepředvídatelnosti.
Go poskytuje dva balíčky pro generování náhodných hodnot ve standardní knihovně: matematika/rand a krypto/rand. The matematika/rand balíček je hlavně pro matematické operace. The krypto/rand balíček zpracovává kryptograficky zabezpečené operace.
Randové balíčky
The matematika/rand balíček poskytuje flexibilní způsob generování náhodných čísel. Implementuje řadu generací pseudonáhodných čísel. Balíček může generovat náhodné číslo s různými distribucemi a používat semena k řízení náhodné sekvence. Může také generovat náhodná čísla souběžně nebo paralelně.
The krypto/rand balíček implementuje kryptograficky bezpečný generátor náhodných čísel. Zahrnuje funkcionalitu pro generování náhodných prvočísel s vysokou pravděpodobností.
Vzhledem k tomu, že tyto balíčky mají stejný název, budete muset použít aliasy, pokud je chcete používat v jednom programu, například:
import (
crand "crypto/rand"
mrand "math/rand"
)
Generování náhodných celých čísel v Go
Můžete použít matematika/randIntn funkce pro generování náhodných čísel v rozsahu.
import (
"fmt"
"math/rand"
"čas"
)funchlavní() {
rand. Semeno (čas. Nyní().UnixNano())// Intn vygeneruje náhodné celé číslo mezi 0 a 100
// (nezahrnuje 100)
randomInt := rand. Intn(100)
fmt. Println (randomInt)
}
Tento kód předá aktuální čas do Semínko funkce. Inicializuje výchozí generátor náhodných čísel pro pseudonáhodnost.
The Intn funkce balíčku rand generuje náhodné číslo mezi zadaným rozsahem, v tomto případě 0 až 100.
Generování náhodných čísel s plovoucí desetinnou čárkou
Můžete generovat náhodná čísla s plovoucí desetinnou čárkou pomocí Float32 a Float64 funkcí. Vracejí 32bitová a 64bitová čísla s plovoucí desetinnou čárkou.
Zde je návod, jak můžete generovat náhodná 64bitová čísla s plovoucí desetinnou čárkou v Go.
import (
"fmt"
"math/rand"
"čas"
)funchlavní() {
rand. Semeno (čas. Nyní().UnixNano())// vygeneruje náhodný float64 mezi 0,0 a 1,0
randomFloat := rand. Float64()
fmt. Println (randomFloat)
}
Proces generování 32bitových čísel s pohyblivou řádovou čárkou je stejný jako při generování náhodných 64bitových čísel s pohyblivou řádovou čárkou.
Generování kryptograficky bezpečných náhodných čísel v Go
Můžete použít Int funkce krypto/rand balíček pro vygenerování kryptograficky bezpečného náhodného čísla. The Int funkce přijímá instanci čtečky a maximální počet pro limit.
import (
"crypto/rand"
"fmt"
"matematický/velký"
)funchlavní() {
// Vytvořte velký. Int s maximální hodnotou pro požadovaný rozsah
max := velký. NewInt(100000000)
// Vygeneruje náhodný velký. Int
// První argument je čtečka, která vrací náhodná čísla
// Druhý argument je maximální hodnota (nevčetně)
randInt, err := rand. Int (rand. Čtenář, max.)
-li chyba!= nula {
fmt. Println("Chyba při generování náhodného čísla:", chyba)
vrátit se
}
fmt. Println("Náhodné číslo:", randInt)
}
The max proměnná definuje maximální hodnotu pro náhodné číslo pomocí NewInt funkce matematika/velký balík. The Int funkce vrací náhodné celé číslo a chybu pro zpracování.
Generování kryptograficky bezpečných náhodných hodnot
The krypto/rand balíček neposkytuje vestavěné funkce pro generování kryptograficky bezpečné náhodné řetězce. Přesto se můžete obejít pomocí Číst funkce.
import (
"crypto/rand"
"fmt"
)funckryptoNáhodně(stringChars tětiva, hodnotaLength int32)tětiva {
bytesSlice := udělat([]byte, valueLength)
_, chyba := rand. Číst (bytesSlice)-li chyba!= nula {
vrátit se"Došlo k chybě při čtení z bajtového řezu"
}pro pos, hodnota := rozsah bytesSlice {
randomize := hodnota % byte(len(stringChars))
bytesSlice[pos] = stringChars[randomize]
}vrátit setětiva(bytesSlice)
}
funchlavní() {
fmt. Println (cryptoRandom("pneumonoultram" +
"ikroskopická silikovovolkanokonióza", 10))
}
The kryptoNáhodně výše uvedená funkce vezme řetězec, ze kterého vygeneruje náhodný řetězec. Trvá také délku – 32bitové celé číslo – a vrací řetězec.
V kryptoNáhodně funkce, bytesSlice proměnná je výsek požadované délky řetězce. Smyčka for-range prochází bajtovým řezem a vrací a získává modul prvků řezu a délku řetězce v bajtech. Aktualizuje index bajtového řezu indexem hodnoty modulo řetězce.
Konečně, kryptoNáhodně Funkce vrací formát řetězce bajtového řezu.
Můžete generovat UUID s Go
Generování náhodných hodnot se hodí pro širokou škálu případů použití. Pokud potřebujete mnoho náhodných, jedinečných hodnot, můžete použít UUID.
UUID (Universally Unique Identifiers) zajišťují globální jedinečnost identifikátorů. Můžete je použít k rozlišení mezi prostředky napříč systémy a zároveň se vyhnout konfliktům v názvech.
Existuje mnoho balíčků, které můžete použít ke generování UUID v Go. K volání uuid můžete použít balíček os příkaz ve vašem operačním systému, použijte balíček UUID společnosti Google nebo k vygenerování použijte balíček gouuid UUID.