gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-04 13:06:53 25 4
gpt4 key购买 nike

我想使用多线程在 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com