Generowanie liczb losowych jest ważne dla wielu zadań. Obejmują one tworzenie gier, kryptografię i analizę danych. Losowe wartości pozwalają na różne wyniki z elementem zmienności i nieprzewidywalności.
Go udostępnia dwa pakiety do generowania losowych wartości w bibliotece standardowej: matematyka/rand I krypto/rand. The matematyka/rand pakiet jest przeznaczony głównie do operacji matematycznych. The krypto/rand pakiet obsługuje operacje zabezpieczone kryptograficznie.
Pakiety Rand
The matematyka/rand pakiet zapewnia elastyczną metodę dla generowanie liczb losowych. Implementuje różne generacje liczb pseudolosowych. Pakiet może generować losową liczbę z różnymi rozkładami i używać nasion do kontrolowania losowej sekwencji. Może również generować liczby losowe jednocześnie lub równolegle.
The krypto/rand pakiet implementuje kryptograficznie bezpieczny generator liczb losowych. Zawiera funkcjonalność generowania losowych liczb pierwszych z dużym prawdopodobieństwem.
Ponieważ te pakiety mają tę samą nazwę, będziesz musiał użyć aliasów, jeśli chcesz użyć obu w jednym programie, na przykład:
import (
kran „krypto/rand”
Pan i „matematyka/rand”
)
Generowanie losowych liczb całkowitych w Go
Możesz użyć matematyka/randZajazd funkcja do generowania liczb losowych w zakresie.
import (
"fmt"
„matematyka/rand”
"czas"
)funkcjagłówny() {
skraj. Nasienie (czas. Now().UnixNano())// Intn generuje losową liczbę całkowitą z przedziału od 0 do 100
// (bez 100)
randomInt := Rand. Zajazd(100)
fmt. Println (randomInt)
}
Ten kod przekazuje bieżący czas do Nasionko funkcjonować. Inicjuje domyślny generator liczb losowych dla pseudolosowości.
The Zajazd Funkcja pakietu rand generuje liczbę losową z określonego zakresu, w tym przypadku od 0 do 100.
Generuj losowe liczby zmiennoprzecinkowe
Możesz generować losowe liczby zmiennoprzecinkowe za pomocą Pływak32 I Pływak64 Funkcje. Zwracają odpowiednio 32-bitowe i 64-bitowe liczby zmiennoprzecinkowe.
Oto jak możesz generować losowe 64-bitowe liczby zmiennoprzecinkowe w Go.
import (
"fmt"
„matematyka/rand”
"czas"
)funkcjagłówny() {
skraj. Nasienie (czas. Now().UnixNano())// wygeneruj losową liczbę float64 między 0.0 a 1.0
losowyFloat := rand. Liczba zmiennoprzecinkowa64()
fmt. Println (randomFloat)
}
Proces generowania 32-bitowych liczb zmiennoprzecinkowych jest taki sam, jak generowanie losowych 64-bitowych liczb zmiennoprzecinkowych.
Generowanie kryptograficznie bezpiecznych liczb losowych w Go
Możesz użyć Int funkcja krypto/rand pakiet do generowania bezpiecznej kryptograficznie liczby losowej. The Int funkcja przyjmuje instancję czytnika i maksymalną liczbę dla limitu.
import (
„krypto/rand”
"fmt"
„matematyka / duży”
)funkcjagłówny() {
// Utwórz duży. Int z maksymalną wartością dla żądanego zakresu
maks := duży. NewInt(100000000)
// Wygeneruj losowy big. Int
// Pierwszym argumentem jest czytnik, który zwraca liczby losowe
// Drugi argument jest wartością maksymalną (nie włącznie)
randInt, błąd := rand. Int (rand. Czytelnik, maks.)
Jeśli błąd!= zero {
fmt. println(„Błąd podczas generowania losowej liczby:”, błąd)
powrót
}
fmt. println("Liczba losowa:"randInt)
}
The maks zmienna definiuje maksymalną wartość dla liczby losowej za pomocą NowyInt funkcja matematyka/duży pakiet. The Int funkcja zwraca losową liczbę całkowitą i błąd obsługi.
Generowanie bezpiecznych kryptograficznie losowych wartości
The krypto/rand package nie zapewnia wbudowanej funkcji do generowania zabezpieczone kryptograficznie losowe ciągi. Mimo to możesz obejść ten problem za pomocą Czytać funkcjonować.
import (
„krypto/rand”
"fmt"
)funkcjakryptoLosowe(stringChars strunowy, wartośćDługość int32)strunowy {
bytesSlice := robić([]bajt, wartośćDługość)
_, błąd := rand. Odczyt (bytesSlice)Jeśli błąd!= zero {
powrót„Wystąpił błąd podczas odczytu fragmentu bajtu”
}Do pozycja, wartość := zakres bytesSlice {
randomizuj := wartość % bajt(Len(stringChars))
bytesSlice[pos] = stringChars[randomize]
}powrótstrunowy(bytesSlice)
}
funkcjagłówny() {
fmt. Println (cryptoRandom(„Pneumonoultram” +
„ikroskopijna krzemowowolkanoconioza”, 10))
}
The kryptoLosowe powyższa funkcja pobiera ciąg, z którego ma zostać wygenerowany losowy ciąg. Przyjmuje również długość — 32-bitową liczbę całkowitą — i zwraca łańcuch.
w kryptoLosowe funkcja, tzw bytesSlice zmienna to wycinek wymaganej długości łańcucha. Pętla for-range przechodzi przez wycinek bajtów i zwraca oraz pobiera moduł elementów wycinka oraz długość łańcucha w bajtach. Aktualizuje indeks wycinka bajtu o indeks wartości modulo łańcucha.
Wreszcie, kryptoLosowe funkcja zwraca format łańcuchowy wycinka bajtów.
Możesz generować identyfikatory UUID za pomocą Go
Generowanie losowych wartości jest przydatne w wielu przypadkach użycia. Jeśli potrzebujesz wielu losowych, unikalnych wartości, możesz użyć identyfikatorów UUID.
Identyfikatory UUID (Universally Unique Identifiers) zapewniają globalną unikalność identyfikatorów. Można ich używać do rozróżniania zasobów w różnych systemach, unikając przy tym konfliktów nazw.
Istnieje wiele pakietów, których można użyć do wygenerowania identyfikatorów UUID w Go. Możesz użyć pakietu os, aby wywołać uuid polecenie w systemie operacyjnym, skorzystaj z pakietu Google UUID lub użyj pakietu gouuid do wygenerowania identyfikatory UUID.