2011-11-27 23 views
9

Czy istnieje funkcja Go, która zwraca prawdziwą liczbę pseudolosową w każdym przebiegu? Chodzi mi o to, rozważ następujący kod,Trudność z pakietem Go Rand

package main 

import (
    "fmt" 
    "rand" 
) 

func main() { 
    fmt.Println(rand.Int31n(100)) 
} 

Za każdym razem, gdy wykonuję ten kod, otrzymuję to samo wyjście. Czy istnieje metoda, która zwróci różne, losowe wyniki za każdym razem, gdy zostanie wywołana?

Odpowiedz

13

Pakiet rand może być używany do generowania pseudo losowe liczby, które są generowane na podstawie określonej wartości początkowej (zwany „seed”).

Popularnym wyborem dla tego początkowego materiału siewnego jest na przykład aktualny czas w nanosekundach - wartość, która prawdopodobnie będzie się różnić podczas wielokrotnego uruchamiania programu. Można zainicjować generator liczb losowych z aktualnym czasem z czymś takim:

rand.Seed(time.Now().UnixNano()) 

(nie zapomnij zaimportować pakiet time do tego)

Istnieje również inny pakiet nazywa crypto/rand które mogą być wykorzystane generowanie lepszych wartości losowych (generator ten może również uwzględniać ruchy myszy użytkownika, bieżące ciepło procesora i wiele innych czynników). Jednak funkcje w tym pakiecie są kilka razy wolniejsze i, o ile nie napiszesz generatora fraz pasujących (lub innych rzeczy związanych z bezpieczeństwem), normalny pakiet randów prawdopodobnie jest w porządku.

+2

Inną użyteczną właściwością zwykłego randu jest to, że możesz odtworzyć wyniki, ponownie wykorzystując ziarno. –

+1

W go1 time.Nanoseconds() wydaje się nie istnieć. Możesz użyć rand.Seed (time.Now(). UnixNano()) – Blacksad

1

Najpierw należy wysiać RNG.

nigdy nie używałem iść, ale to chyba rand.Seed(x);

+0

To znaczy, że to opakowanie główne importu "FMT" importu "Rand" func główny() { rand.Seed (100); \t fmt.Println (rand.Int31n (100)) }. Daje również taką samą wydajność przez cały czas. – Arpssss

+0

Dzieje się tak, ponieważ wysyłasz go statycznym numerem 100 :-) Spróbuj użyć czegoś bardziej unikalnego, na przykład bieżącego czasu w milisekundach. –

0

rand.Seed(time.Now().UnixNano()) działa na systemie Ubuntu. Spędziłem na zawsze badanie rand.Seed(time.Nanoseconds()). W końcu znalazłem przykład: Google Search 2.1 na trasie golang.

Powiązane problemy