【发布时间】:2019-04-08 22:01:11
【问题描述】:
我正在尝试编写一个多行的赛马模拟器。 每行将代表一个由 goroutine 计算的马的位置。
由于某种原因,代码在 Go Playground 上运行时不会像在我的机器上那样随机输出数字。
package main
import (
"math/rand"
"os"
"strconv"
"time"
)
var counter = 0
func main() {
i := 1
horses := 9
for i <= horses {
go run(i)
i++
}
time.Sleep(5000 * time.Millisecond)
print("\ncounter: " + strconv.Itoa(counter))
print("\nEnd of main()")
}
func run(number int) {
var i = 1
var steps = 5
for i <= steps {
print("[" + strconv.Itoa(number) + "]")
rand.Seed(time.Now().UnixNano())
sleep := rand.Intn(10)
time.Sleep(time.Duration(sleep) * time.Millisecond)
i++
counter++
}
if i == steps {
println(strconv.Itoa(number) + " wins")
os.Exit(1)
}
}
游乐场:https://play.golang.org/p/pycZ4EdH7SQ
我的无序输出是:
[1][5][8][2][3][4][7][9][6][7][9][9][4][3]...
但我的问题是我将如何打印以下数字:
[1][1]
[2][2][2][2][2][2][2][2]
[3][3][3]
...
[N][N][N][N][N]
【问题讨论】:
-
这是终端仿真器特有的,不是真正的 Go 编程问题。
-
如果你想附加到之前写的行,你需要清除和重写。
-
关于随机顺序,rand.Seed(...) 旨在被调用一次,具有非恒定值。通常,当前时间在大多数环境中随着时间的推移而合适,但操场总是在同一时间开始(因此它总是可预测的)。将 rand.Seed(..) 移动到 main() 的顶部。