23578


for文で何回か乱数を発生させ、条件を満たしていればfor文を脱出する仕組みにしたいのですが、普通に動かすと毎回同じ数値になります。そこで

[code]

    rand.Seed(time.Now().UnixNano())
    
[/code]

をfor文に入れましたが、

> .\truezundoko2.go:31(ファイル名です。): rand.Seed undefined (type [5]int has no
> field or method Seed)

と出ました。  
以下、問題のソースコードです。

[code]

    package main
    
    import (
        "fmt"
        "math/rand"
        "time"
    )
    
    func random(min, max int) int {
        rand.Seed(time.Now().Unix())
        return rand.Intn(max - min) + min
    }
    
    func main() {
        rand := [5]int{0, 0, 0, 0, 0}
        i := 0
        sum := rand[4]*16+rand[3]*8+rand[2]*4+rand[1]*2+rand[0]
        kiyoshi := 0
        Rs :=  random(1,3)
        for kiyoshi < 1{
                for i = 4;i > 0; i-- {
                rand[i] = rand[i-1]}
                if  Rs == 1 {
                    rand[0] = 1
                    fmt.Println("Zun\n")
                }else{
                    rand[0] = 0
                    fmt.Println("Doko\n")
                }
            Rs =  random(1,3)
            **rand.Seed(time.Now().UnixNano())**
            sum = rand[4]*16+rand[3]*8+rand[2]*4+rand[1]*2+rand[0]
            if(sum == 30){
                    fmt.Println("Kiyoshi!!")
                kiyoshi = 1
            }
        }
    }
    
[/code]

わかる方、ご協力をお願いします。


CC BY-SA 3.0
2016-03-29T02:21:42.317
23576
2016-03-29T03:40:06.057
2016-03-29T02:30:45.440
14972
question
go
シード値を毎回変更する方法を教えてください。


エラーメッセージのとおりです。

`main` 関数の先頭で `rand` という配列を宣言してしまっているため、パッケージ名の `rand`
が上書きされてしまっています。配列を別の名前に変えれば動作します。


CC BY-SA 3.0
2016-03-29T02:26:42.730
23578
2016-03-29T02:26:42.730
216
23576
answer


random seed の設定は一度で十分なので `init()` を使う方法もあるかと思います。

# まぁ、パッケージ名と同じ名前の変数の使用は避けるべきではありますが(`math/rand` パッケージにエイリアスを付けてアクセスしても良いかも)

[code]

    package main
    
    import (
      "fmt"
      "math/rand"
      "time"
    )
    
    func init() {
      rand.Seed(time.Now().UnixNano())
    }
    
    func random(min, max int) int {
      return rand.Intn(max-min) + min
    }
    
    func main() {
      rand := [5]int{0, 0, 0, 0, 0}
      for {
        for i := 4; i > 0; i-- {
          rand[i] = rand[i-1]
        }
        if random(1, 3) == 1 {
          rand[0] = 1
          fmt.Println("Zun\n")
        } else {
          rand[0] = 0
          fmt.Println("Doko\n")
        }
        sum := rand[4]*16 + rand[3]*8 + rand[2]*4 + rand[1]*2 + rand[0]
        if sum == 30 {
          fmt.Println("Kiyoshi!!")
          break
        }
      }
    }
    
[/code]


CC BY-SA 3.0
2016-03-29T03:34:00.947
23583
2016-03-29T03:40:06.057
2016-03-29T03:40:06.057
23576
answer