multithreading - 在 Julia 的多线程循环中设置种子

标签 multithreading for-loop random julia

我想使用多线程在 Julia 中生成随机数。我正在使用Threads.@threads宏来完成它。但是,每次运行代码时,我都很难固定种子的数量以获得相同的结果。这是我的试验:

Random.seed!(1234)
a = [Float64[] for _ in 1:10]

Threads.@threads for i = 1:10
    push!(a[Threads.threadid()],rand())
end

sum(reduce(vcat, a))
每次运行时,上面的脚本都会产生不同的结果。相比之下,如果我使用普通的 for 循环,我会得到相同的结果:
Random.seed!(12445)
b = []

for i = 1:10
    push!(b,rand())
end

sum(b)
我的印象是,这个问题的解决方案一定很容易。尽管如此,我还是找不到。任何帮助深表感谢。
谢谢你。

最佳答案

您需要为每个线程生成一个单独的随机流。
最简单的方法是使用不同种子的随机数生成器:

using Random

rngs = [MersenneTwister(i) for i in 1: Threads.nthreads()];

Threads.@threads for i = 1:10
     val = rand(rngs[Threads.threadid()])
     # do something with val
end
如果您不想为不同的随机数种子冒险相关性,您实际上可以跳过单个数字生成器:
julia> rngs2 = Future.randjump.(Ref(MersenneTwister(0)), big(10)^20 .* (1:Threads.nthreads()))
4-element Vector{MersenneTwister}:
 MersenneTwister(0, (200000000000000000000, 0))
 MersenneTwister(0, (400000000000000000000, 0))
 MersenneTwister(0, (600000000000000000000, 0))
 MersenneTwister(0, (800000000000000000000, 0))

关于multithreading - 在 Julia 的多线程循环中设置种子,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/69030310/

相关文章:

c++ - for循环c++的问题

java - 从 Java 8 开始有什么理由写 `new Random()` 吗?

c++ - <random> uniform_real_distribution 点间距离最小

c# - 为什么我的随机数生成器用相同的数字为两个数组播种?

multithreading - Delphi 上的线程上下文

java - 尝试传递 InputStream 时出现 StreamCorruptedException

JavaFX : why wait cursor needs a new thread?

java - 为什么servlet的init()方法运行在不同的线程中?

javascript - 在 JavaScript 中使用 `for..of` 获取键/值

java - 让break语句工作,但无法弄清楚java for条件