Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- from random import *
- from math import *
- from time import *
- from numba import *
- import numpy as np
- from pprint import pprint
- from numba.types import *
- import matplotlib.pyplot as plt
- spec = [
- ('t4', int64),
- ('t5', int64),
- ('n5', int64),
- ('z4', int64),#Нужная четвёрка
- ('n4', int64),
- ('u', float64),
- ]
- @jitclass(spec)
- class ruletka:
- def __init__(self,t4,t5):
- self.t4=t4
- self.t5=t5
- self.u=e+(1-e)*random()
- self.n5=0
- self.z4=0
- self.n4=0
- ...
- def p5(self):
- self.n5+=1
- self.t5=0
- self.u=random()
- def p4(self):
- if random()<0.5/16:#50% на оружие, 16 вариантов.
- #Для акционной можно написать что-то вроде 0.5/3 для рейт-апа,
- # и 0.25/10 (-3 лизы, кейи и эмбер и ещё -3 рейт-ап персонажа 50% на рейтап, 50% на оружие) - если ты роллишь не рейт-ап персонажа
- self.z4+=1
- self.n4+=1
- self.t4=0
- def p3(self):
- ...
- def roll(self,n=1):
- for h in range(n):
- self.t5+=1
- self.t4+=1
- if (self.t5>=78 or self.u<=0.06):#Тут другая формула - я поставил эту чтобы таблицу на 20 строк сюда не засовывать
- self.p5()
- elif (self.t4>=10 or random()<0.051):
- self.p4()
- else:
- self.p3()
- ...
- @staticmethod
- def exp(p,mlt,N=1000):#Эксперементы через рандом, выбить "p" дублей за mlt молитв
- r=0
- for i in range(N):
- h=ruletka(0,0)
- h.roll(mlt)
- r+=h.z4>=p
- return r/N
- ...
- def test(N):
- t=time()
- for c in range(1,7):#Перебор от 1 до 6 конст
- xx=np.arange(1,N)
- yy=np.zeros(xx.shape)#Значения теории вероятности
- for i in range(len(xx)):
- x=int(xx[i]*0.13) #Округляю количестов с шансов в 13%
- yy[i]=sum(comb(x,d)*(1/32)**d*(31/32)**(x-d) for d in range(c,50))
- #Формула бернулли, но подходят не только ровно 4 консты, но
- #и 5,6 ... - я до 50 суммирую. Вроде бы это гипергеометрическое распределение.
- plt.plot(xx,yy,'-',color=(0.5,0.5,0.5),linewidth=1)
- xx=xx[::5]
- zz=np.zeros(xx.shape)#Эксперементальные теории вероятности
- for i in range(len(xx)):
- zz[i]=ruletka.exp(c,xx[i])# Ага, оно повторится шесть раз. Если переписать иначе - код станет немного менее читаемый
- s = time()
- if s-t>0.5:
- print(f"Обрабатывается c{c}, молитвa {i} - [{(((c-1)*N)+xx[i])/(6*N):.1%}]")
- t=s
- plt.plot(xx,zz,'.',linewidth=1,label=f'c{c}')
- plt.grid(True,which='both')
- plt.show()
- test(1000)
Advertisement
Add Comment
Please, Sign In to add comment