गो

2011-05-30 15 views
28

में रैंडम नंबर जेनरेट करना मैं गो में यादृच्छिक संख्या (पूर्णांक) उत्पन्न करने की कोशिश कर रहा हूं, इसका कोई फायदा नहीं हुआ। मुझे rand पैकेज crypto/rand में मिला, जो मुझे लगता है कि ऐसा लगता है, लेकिन मैं प्रलेखन से इसका उपयोग कैसे नहीं कर सकता। यह वह जगह है अभी मैं क्या कोशिश कर रहा हूँ:गो

b := []byte{} 
    something, err := rand.Read(b) 
    fmt.Printf("something = %v\n", something) 
    fmt.Printf("err = %v\n", err) 

लेकिन दुर्भाग्य से यह हमेशा आउटपुट:

something = 0 
    err = <nil> 

वहाँ इतना है कि यह वास्तव में यादृच्छिक संख्या उत्पन्न करता है इसे ठीक करने के लिए एक रास्ता है? वैकल्पिक रूप से, क्या यह उत्पन्न होता है यादृच्छिक संख्याओं पर ऊपरी बाउंड सेट करने का कोई तरीका है?

+0

मुझे लगता है कि नियमित सरणी 'यादृच्छिक बाइट्स के साथ b' को भरने के लिए उम्मीद करेंगे, हालांकि कई आप के लिए कहा। – sarnold

+0

मुझे भी - मैं सिर्फ जाने के लिए नया हूं और कॉलिंग सम्मेलनों या इसी तरह से परिचित नहीं हूं। –

+1

यह 'बी' भर जाएगा हालांकि' बी' एक खाली टुकड़ा है (और बैकिंग सरणी आकार 0 है)। तो rand.Read() में कुछ भी स्टोर करने की कोई जगह नहीं है, और आपके 'कुछ' चर में 0 देता है जो इंगित करता है कि कुछ भी संग्रहीत नहीं किया गया था। 'बी: = मेक ([] बाइट, 4) 'रैंड की अनुमति देने के लिए और अधिक उचित होता। बी – nos

उत्तर

24

crypto/rand यादृच्छिक डेटा का केवल बाइनरी प्रवाह प्रदान करता है, लेकिन आप इसे encoding/binary का उपयोग करने से पूर्णांकों पढ़ सकते हैं:

package main 

import "encoding/binary" 
import "crypto/rand" 

func main() { 
    var n int32 
    binary.Read(rand.Reader, binary.LittleEndian, &n) 
    println(n) 
} 
+0

ग्रेट में 4 बाइट्स स्टोर करने के लिए पढ़ें, जो मेरे लिए काम करता है। धन्यवाद! –

+0

आपको बाइनरी पर त्रुटि की जांच करनी चाहिए। पढ़ें? – Gabriel

+0

मैंने इसे खेल के मैदान पर करने की कोशिश की और हमेशा एक ही परिणाम प्राप्त करें: https://play.golang.org/p/Bh-f4QEyKf – Karlom

27

आपके उपयोग के मामले के आधार पर, एक और विकल्प math/rand पैकेज है। ऐसा न करें यदि आप संख्याएं उत्पन्न कर रहे हैं जिन्हें पूरी तरह से अप्रत्याशित होने की आवश्यकता है। यह सहायक हो सकता है यदि आपको पुन: उत्पन्न करने वाले परिणाम प्राप्त करने की आवश्यकता है, हालांकि - केवल उसी बीज में पारित करें जिसे आपने पहली बार पारित किया था।

यहाँ क्लासिक "बीज वर्तमान समय के साथ जनरेटर और एक संख्या उत्पन्न" है कार्यक्रम:

package main 

import (
    "fmt" 
    "math/rand" 
    "time" 
) 

func main() { 
    rand.Seed(time.Now().Unix()) 
    fmt.Println(rand.Int()) 
} 
16

1 अप्रैल 2012 की के रूप में, लैंग की स्थिर संस्करण के रिलीज के बाद, आप कर सकते हैं निम्नलिखित:

 
package main

import "fmt" import "time" import "math/rand"

func main() { rand.Seed(time.Now().UnixNano()) // takes the current time in nanoseconds as the seed fmt.Println(rand.Intn(100)) // this gives you an int up to but not including 100 }

+0

यह छद्म-यादृच्छिक संख्याओं के लिए पूछते समय मुझे बहुत उम्मीद है। 'समय.अब()। यूनिक्स()' यूनिक्स नैनो() 'की तरह पर्याप्त नहीं है। – AndrewPK