import random
class Probability:
'''
Probability has 4 init syntax:
1.pro=Probability(kwargs_dict)
2.pro=Probability(__else__,kwargs_dict)
3.pro=Probability(**kwargs)
4.pro=Probability(__else__,**kwargs)
'''
def __init__(self, __else__=None,kwargs_dict={},**kwargs):
if type(__else__)==dict:
kwargs_dict=__else__
__else__=None
if not kwargs_dict and not kwargs:
raise ValueError('__init__() must take one argument between dict and **kwargs(0 given)')
if kwargs_dict and kwargs:
raise ValueError('__init__() takes only one argument between dict and **kwargs(2 given)')
if kwargs_dict:
kwargs=kwargs_dict
total = 0
for key in kwargs:
total+=kwargs[key]
if total>100:
raise ValueError('The sum of the argment of Probability() must Less than or equal to 100')
self.pros=kwargs
self.__else__=__else__
self.total=total
self.diary=[]
def get(self):
num=random.random()*100
now=0
for key in self.pros:
if now<num<=now+self.pros[key]:
self.diary.append(key)
return key
now+=self.pros[key]
self.diary.append(self.__else__)
return self.__else__
def test(self,num=100000):
d={}
for _ in range(num):
key=self.get()
if key in d:
d[key]+=1
else:
d[key]=0
return d
def append(self,kwargs_dict={},**kwargs):
if not kwargs_dict and not kwargs:
raise ValueError('append() must takes one argument between dict and **kwargs(0 given)')
if kwargs_dict and kwargs:
raise ValueError('append() takes only one argument between dict and **kwargs(2 given)')
if kwargs_dict:
kwargs=kwargs_dict
total = self.total
pros=self.pros
for key in kwargs:
total+=kwargs[key]
pros[key]=kwargs[key]
if total>100:
raise ValueError('和不能大于100')
self.pros=pros
self.total=total
class Average_Probability(Probability):
'''
Average_Probability has 2 init syntax:
1.pro=Probability(args_list)
2.pro=Probability(*args)
( 2.pro=Probability([],*args) )
'''
def __init__(self, args_list=[], *args):
if not args_list and not args:
raise ValueError('__init__() must takes one argument between list and *args(0 given)')
if args_list and args and type(args_list)==list:
raise ValueError('__init__() takes only one argument between list and *args(2 given)')
if args_list and type(args_list)==list:
args=args_list
if type(args_list)!=list:
args=list(args)
args.append(args_list)
pros={}
for i in args:
pros[i]=100/len(args)
self.pros=pros
self.__else__=None
self.total=len(args)
self.diary=[]
def append(self,args_list=[],*args):
if not args_list and not args:
raise ValueError('__init__() must takes one argument between list and *args(0 given)')
if args_list and args and type(args_list)==list:
raise ValueError('__init__() takes only one argument between list and *args(2 given)')
if args_list and type(args_list)==list:
args=args_list
if type(args_list)!=list:
args=list(args)
args.append(args_list)
args+=list(self.pros.keys())
args=set(args)
pros={}
for i in args:
if i not in pros:
pros[i]=100/len(args)
self.pros=pros
self.total=len(args)
class randrange(Probability):
def __init__(self, start, stop=None, step=None):
self.start=start
self.stop=stop
self.step=step
def get(self):
if self.step:
return random.randrange(self.start,self.stop,self.step)
if self.stop:
return random.randrange(self.start,self.stop)
return random.randrange(self.start,self.stop,self.step)
def __str__(self):
return str(self.get())
class Branch(Probability):
'''
bra=Branch(10,30,25).get()
if bra==0:
pass
elif bra==1:
pass
elif bra==2:
pass
else:
pass
'''
def __init__(self,*args):
super().__init__('else',{i:args[i] for i in range(len(args))})
用法:
from probability import Probability as pro
print(pro('else',a=10,b=20,c=40).get())