Guest User

Untitled

a guest
Feb 1st, 2021
81
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 3.28 KB | None | 0 0
  1. from random import *
  2. from math import *
  3. from time import *
  4. from numba import *
  5. import numpy as np
  6. from pprint import pprint
  7. from numba.types import *
  8. import matplotlib.pyplot as plt
  9.  
  10.  
  11.  
  12.  
  13. spec = [
  14.     ('t4', int64),
  15.     ('t5', int64),
  16.     ('n5', int64),
  17.     ('z4', int64),#Нужная четвёрка
  18.     ('n4', int64),
  19.     ('u', float64),
  20. ]
  21.  
  22. @jitclass(spec)
  23. class ruletka:
  24.     def __init__(self,t4,t5):
  25.         self.t4=t4
  26.         self.t5=t5
  27.         self.u=e+(1-e)*random()
  28.         self.n5=0
  29.         self.z4=0
  30.         self.n4=0
  31.         ...
  32.     def p5(self):
  33.         self.n5+=1
  34.         self.t5=0
  35.         self.u=random()
  36.     def p4(self):
  37.         if random()<0.5/16:#50% на оружие, 16 вариантов.
  38.             #Для акционной можно написать что-то вроде 0.5/3 для рейт-апа,
  39.             # и 0.25/10 (-3 лизы, кейи и эмбер и ещё -3 рейт-ап персонажа 50% на рейтап, 50% на оружие) - если ты роллишь не рейт-ап персонажа
  40.             self.z4+=1
  41.         self.n4+=1
  42.         self.t4=0
  43.     def p3(self):
  44.         ...
  45.     def roll(self,n=1):
  46.         for h in range(n):
  47.             self.t5+=1
  48.             self.t4+=1
  49.             if (self.t5>=78 or self.u<=0.06):#Тут другая формула - я поставил эту чтобы таблицу на 20 строк сюда не засовывать
  50.                 self.p5()
  51.             elif (self.t4>=10 or random()<0.051):
  52.                 self.p4()
  53.             else:
  54.                 self.p3()
  55.         ...
  56.     @staticmethod
  57.     def exp(p,mlt,N=1000):#Эксперементы через рандом, выбить "p" дублей за mlt молитв
  58.         r=0
  59.         for i in range(N):
  60.             h=ruletka(0,0)
  61.             h.roll(mlt)
  62.             r+=h.z4>=p
  63.         return r/N
  64.     ...
  65.  
  66.  
  67.  
  68. def test(N):
  69.     t=time()
  70.  
  71.     for c in range(1,7):#Перебор от 1 до 6 конст
  72.         xx=np.arange(1,N)
  73.         yy=np.zeros(xx.shape)#Значения теории вероятности
  74.         for i in range(len(xx)):
  75.             x=int(xx[i]*0.13) #Округляю количестов с шансов в 13%
  76.             yy[i]=sum(comb(x,d)*(1/32)**d*(31/32)**(x-d) for d in range(c,50))
  77.             #Формула бернулли, но подходят не только ровно 4 консты, но
  78.             #и 5,6 ... - я до 50 суммирую. Вроде бы это гипергеометрическое распределение.
  79.         plt.plot(xx,yy,'-',color=(0.5,0.5,0.5),linewidth=1)
  80.  
  81.         xx=xx[::5]
  82.         zz=np.zeros(xx.shape)#Эксперементальные теории вероятности
  83.         for i in range(len(xx)):
  84.             zz[i]=ruletka.exp(c,xx[i])# Ага, оно повторится шесть раз. Если переписать иначе - код станет немного менее читаемый
  85.  
  86.             s = time()
  87.             if s-t>0.5:
  88.                 print(f"Обрабатывается c{c}, молитвa {i}  - [{(((c-1)*N)+xx[i])/(6*N):.1%}]")
  89.                 t=s
  90.  
  91.         plt.plot(xx,zz,'.',linewidth=1,label=f'c{c}')
  92.  
  93.  
  94.  
  95.     plt.grid(True,which='both')
  96.     plt.show()
  97.  
  98. test(1000)
Advertisement
Add Comment
Please, Sign In to add comment