我用Threads.@threads 来for循环3次,循环内的函数有随机数randn()项,但是模拟出来的3个trials的结果是一模一样,请问这种情况该怎么解决呢,设立种子可以解决吗,如果可以怎么设置呢,
你的Julia版本是什么
非常奇怪。除非,@threads
内部设了 random seed.
x = []
lock = Channel{Bool}(1)
Threads.@threads for i in 1:Threads.nthreads()
put!(lock, true)
push!(x, randn())
take!(lock)
end
Threads.nthreads() #
x # 不一样
using Random
x = []
lock = Channel{Bool}(1)
Threads.@threads for i in 1:Threads.nthreads()
put!(lock, true)
Random.seed!(0)
push!(x, randn())
take!(lock)
end
Threads.nthreads()
x # 一样的
1.3开始rand是thread safe的,所以在报错的时候麻烦讲清楚版本。
1.3 并非完全thread safe。 把lock去掉就清楚了。
我用的是1.3.
你这里指定seed了,我记得没错的话1.3的global seed是每个thread里都会给一份的。可以看下GLOBAL RNG那个const的实现