如何初始化 PRNG 以在 Julia 和 Python 中产生相同的输出?

问题描述 投票:0回答:2

我有以下 Julia 代码来生成合成数据。

using Statistics
using Random

seed_value = 42
Random.seed!(seed_value)

f(x, t) = 3.2 * (x + 0.2t)

n_meas = 20
X = zeros(n_meas, 2)
X[:, 1] .= 1 * rand(n_meas)
X[:, 2] .= 2 * rand(n_meas)

u_meas = f.(X[:, 1], X[:, 2])
u_meas .+= 0.05 * mean(u_meas) * randn(n_meas)
print(u_meas)

生成与上面相同的数据集(u_meas)的正确Python代码是什么?

我尝试了下面的代码,但它没有打印出与我的 Julia 代码相同的结果

import numpy as np
np.random.seed(42)
def f(x, t):
    return 3.2 * (x + 0.2 * t)

n_meas = 20
X = np.zeros((n_meas, 2))
X[:, 0] = 1 * np.random.rand(n_meas)
X[:, 1] = 2 * np.random.rand(n_meas)

u_meas = f(X[:, 0], X[:, 1])
u_meas += 0.05 * np.mean(u_meas) * np.random.randn(n_meas)
print("u_meas:")
print(u_meas)
python numpy random julia
2个回答
1
投票

最快的解决方案可能是依赖 C 标准库中的

rand

julia> @ccall srand(42::Int32)::Cint
1

julia> @ccall rand()::Int32
71876166

julia> @ccall rand()::Int32
708592740
In [1]: from ctypes import CDLL

In [2]: libc = CDLL("libc.so.6")
   ...: libc.srand(42)
Out[2]: 1

In [3]: libc.rand()
Out[3]: 71876166

In [4]: libc.rand()
Out[4]: 708592740

当然,您必须编写一些额外的代码才能将生成的 32 位整数转换为浮点数(参见此处)。需要注意的是,这“不是一个好的随机生成器”,但这是否重要取决于您的预期用途。


0
投票
https://github.com/JuliaPy/PythonCall.jl

调用 python->julia 或 julia-> python。与使用 C 中的 rand 相比,这样做的优点是 C 的

rand
非常糟糕(无论是在随机数的质量方面,还是因为这样做需要您自己实现所有采样算法。)
    

© www.soinside.com 2019 - 2024. All rights reserved.