#python #numpy #random
#python #numpy #Случайный
Вопрос:
Мне нужно сгенерировать другой набор случайных чисел внутри второго цикла for . Но каждый раз, когда выполняется второй цикл for, он генерирует один и тот же набор случайных чисел.
class pricing_lookback:
def __init__(self,spot,rate,sigma,time,sims,steps):
self.spot = spot
self.rate = rate
self.sigma = sigma
self.time = time
self.sims = sims
self.steps = steps
self.dt = self.time/self.steps
def call_floatingstrike(self):
pathwiseminS = np.array([])
simulationS = np.array([])
simulationSt = np.array([])
call2 = np.array([])
tst1 = np.array([])
for j in range(self.sims):
sT = self.spot
for i in range(self.steps):
phi= np.random.rand()
sT *= np.exp((self.rate-0.5*self.sigma*self.sigma)*self.dt self.sigma*phi*np.sqrt(self.dt))
pathwiseminS = np.append(pathwiseminS, sT)
tst1 = np.append(tst1, pathwiseminS[1])
call2 = np.append(call2, np.max((pathwiseminS[self.steps-1]-self.spot),0))
simulationSt = np.append(simulationS,pathwiseminS[self.steps-1])
simulationS = np.append(simulationS,min(pathwiseminS))
call = np.average(simulationSt) - np.average(simulationS)
return call,call2, tst1
pricelookback = pricing_lookback(110,0.05,0.2,1,200,252)
clookback, call2, t1 = pricelookback.call_floatingstrike()
print(clookback,t1)
Комментарии:
1. После запуска вашего кода остается единственная «случайная» строка
phi = np.random.rand()
, и каждый раз при запуске она выдает другое значение, я думаю, что ваша ошибка где-то в другом месте. Мое первое предположение заключается в том, что вы просто добавляете одно и то же значение снова и снова в свой выходной список2. Нет, каждый раз, когда цикл запускается, он начинает генерировать один и тот же набор случайных чисел. Итак, у меня есть 200 сценариев и 252 временных момента в каждом. Каждый сценарий имеет один и тот же набор случайных чисел в одной и той же последовательности.
3. если это так, вам нужен вызов np.random.seed()
4. @TomLubenow я не уверен, как использовать его в этом случае. Не могли бы вы уточнить, пожалуйста?
5. Компьютеры не могут быть случайными. Это детерминированные машины, потому что мы не знаем, как их построить каким-либо другим способом. В результате они на самом деле не могут создавать случайные числа, все «случайные» числа на самом деле псевдослучайны. Об этом можно много прочитать, если вы посмотрите генераторы псевдослучайных чисел. Короче говоря, вы будете продолжать получать одну и ту же последовательность кажущихся случайными чисел (потому что они на самом деле не случайны), если вы не «затравите» свой генератор случайных чисел. У Numpy есть функция для этого: np.random.seed().
Ответ №1:
Как указал @user3483203, ваша ошибка где-то в другом месте. Все переменные рандомизируются во втором цикле for: переменная phi
и sT
является случайной в каждом цикле. Вы добавляете pathwiseminS[1]
(постоянное, нерандомизированное значение) к tst1
или t1
каждый раз, который является первым элементом или первым значением цикла sT
. Вы должны попробовать обновить / очистить pathwiseminS
(как я думаю, это то, что вы пытаетесь сделать), например:
def call_floatingstrike(self):
simulationS = np.array([])
simulationSt = np.array([])
call2 = np.array([])
tst1 = []
for j in range(self.sims):
sT = self.spot
pathwiseminS = np.array([]) #notice the placement here
for i in range(self.steps):
phi= np.random.rand()
sT *= np.exp((self.rate-0.5*self.sigma*self.sigma)*self.dt self.sigma*phi*np.sqrt(self.dt))
pathwiseminS = np.append(pathwiseminS, sT)
tst1 = np.append(tst1, pathwiseminS[1])
call2 = np.append(call2, np.max((pathwiseminS[self.steps-1]-self.spot),0))
simulationSt = np.append(simulationS,pathwiseminS[self.steps-1])
simulationS = np.append(simulationS,min(pathwiseminS))
call = np.average(simulationSt) - np.average(simulationS)
return call,call2, tst1
Комментарии:
1. Это работает, но довольно странно, почему он это делает! Большое вам спасибо, очень ценю это.