Skip to content
Advertisement

random number generating function as argument in python

I want to pass a function which generates random normal numbers to another function, do some calculations and pass again the random function x times. At the end there should be a Dataframe with x colums with diffrent randomly generated outcomes.

My code looks like this:

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)

But this gives me always identical columns.

test_function(simulate_normal_numbers(mean_vec, cov_mat, timeframe), timeframe, nr_simulations)

Advertisement

Answer

I don’t think you can pass the function like that. You should pass the function and the argument separately

Something like

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)

be aware that the cov matrix should be symmetrical and positive.

User contributions licensed under: CC BY-SA
4 People found this is helpful
Advertisement