julia中多线程循环中的随机数问题


#1

我用Threads.@threads 来for循环3次,循环内的函数有随机数randn()项,但是模拟出来的3个trials的结果是一模一样,请问这种情况该怎么解决呢,设立种子可以解决吗,如果可以怎么设置呢,:thinking:


#2

你的Julia版本是什么


#3

非常奇怪。除非,@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 # 一样的

#4

1.3开始rand是thread safe的,所以在报错的时候麻烦讲清楚版本。


#5

1.3 并非完全thread safe。 把lock去掉就清楚了。

我用的是1.3.


#6

你这里指定seed了,我记得没错的话1.3的global seed是每个thread里都会给一份的。可以看下GLOBAL RNG那个const的实现