python 中作为参数的随机数生成函数
random number generating function as argument in python
我想将一个生成随机正态数的函数传递给另一个函数,进行一些计算并再次传递随机函数 x 次。最后应该有一个包含 x 列的 Dataframe,其中包含不同的随机生成结果。
我的代码如下所示:
timeframe = 10
nr_simulations = 10
mean_vec = np.random.rand(10)
cov_mat = np.random.rand(10,10)
r_n = np.zeros((timeframe, nr_simulations))
def test_function(func, timeframe, nr_simulations):
for i in range(0, nr_simulations):
r_n[:,i] = func.mean(axis=1)
def simulate_normal_numbers(mean_vec, cov_mat, timeframe):
return np.random.multivariate_normal(mean_vec, cov_mat, timeframe)
但这给了我总是相同的列。
test_function(simulate_normal_numbers(mean_vec, cov_mat, timeframe), timeframe, nr_simulations)
问题是您的 np.random.rand(...)
语句在函数被调用之前已经被评估。如果每次调用函数时都需要新的随机数,则需要在函数中调用 np.random.rand(...)
。
我认为你不能那样传递函数。您应该分别传递函数和参数
类似
import numpy as np
timeframe = 10
nr_simulations = 10
mean_vec = np.random.rand(10)
cov_mat = np.random.rand(10,10)
cov_mat = np.maximum( cov_mat, cov_mat.transpose() )
r_n = np.zeros((timeframe, nr_simulations))
def test_function(func, timeframe, nr_simulations, arg):
for i in range(0, nr_simulations):
r_n[:,i] = func(*arg).mean(axis=1)
def simulate_normal_numbers(mean_vec, cov_mat, timeframe):
return np.random.multivariate_normal(mean_vec, cov_mat, timeframe)
test_function(simulate_normal_numbers , timeframe, nr_simulations,arg = (mean_vec, cov_mat, timeframe))
print(r_n)
请注意,cov 矩阵应该是对称且正的。
我想将一个生成随机正态数的函数传递给另一个函数,进行一些计算并再次传递随机函数 x 次。最后应该有一个包含 x 列的 Dataframe,其中包含不同的随机生成结果。
我的代码如下所示:
timeframe = 10
nr_simulations = 10
mean_vec = np.random.rand(10)
cov_mat = np.random.rand(10,10)
r_n = np.zeros((timeframe, nr_simulations))
def test_function(func, timeframe, nr_simulations):
for i in range(0, nr_simulations):
r_n[:,i] = func.mean(axis=1)
def simulate_normal_numbers(mean_vec, cov_mat, timeframe):
return np.random.multivariate_normal(mean_vec, cov_mat, timeframe)
但这给了我总是相同的列。
test_function(simulate_normal_numbers(mean_vec, cov_mat, timeframe), timeframe, nr_simulations)
问题是您的 np.random.rand(...)
语句在函数被调用之前已经被评估。如果每次调用函数时都需要新的随机数,则需要在函数中调用 np.random.rand(...)
。
我认为你不能那样传递函数。您应该分别传递函数和参数
类似
import numpy as np
timeframe = 10
nr_simulations = 10
mean_vec = np.random.rand(10)
cov_mat = np.random.rand(10,10)
cov_mat = np.maximum( cov_mat, cov_mat.transpose() )
r_n = np.zeros((timeframe, nr_simulations))
def test_function(func, timeframe, nr_simulations, arg):
for i in range(0, nr_simulations):
r_n[:,i] = func(*arg).mean(axis=1)
def simulate_normal_numbers(mean_vec, cov_mat, timeframe):
return np.random.multivariate_normal(mean_vec, cov_mat, timeframe)
test_function(simulate_normal_numbers , timeframe, nr_simulations,arg = (mean_vec, cov_mat, timeframe))
print(r_n)
请注意,cov 矩阵应该是对称且正的。