Нужно генерировать разные случайные числа каждый раз, когда выполняется цикл

#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. Это работает, но довольно странно, почему он это делает! Большое вам спасибо, очень ценю это.