抽奖基本需求

1、假设中奖概率为:获得 a道具 10% b道具 20% c道具 30% d道具 40%

2、基本的想法是:生成1-100的连续数组,随机生成一个整数,如果是1-10 则中a、10-30 中b、30-60中c、60-100中d

实现方法一:布尔判断

1、第一种方法,直接判断数据在哪个范围,非常简单

def choujiang0():

#生成一个1-100的随机整数

x = np.random.randint(0,100,dtype='int')

if x>=0 and x<10:

return 'a'

if x>=10 and x<30:

return 'b'

if x>=30 and x<60:

return 'c'

if x>=60:

return 'd'

实现方法二:算法判断

2、第二种方法:作为一个程序猿,不能满足于这种太简单的方法,不适合拓展嘛,所以想办法做改造下,用一个算法来实现抽奖,主要有以下两种方式:

2.1 把一个初始概率用字典来做配置,注意这里字典的键值是10、30、60、100,然后通过程序生成整数,判断这个整数落在区间里的概率,对应字典得到获得的奖励,以下是choujiang1方法:

ratio = {10:'a',30:'b',60:'c',100:'d'}

def choujiang1():

#生成一个1-100的随机整数

x = np.random.randint(1,101,dtype='int')

#生成一个1-100的数组

mother = [x for x in range(1,101,1)]

#判断x在数组的什么位置

x_position = mother.index(x)

pre_number = 0

for key in ratio.keys():

if x_position - pre_number>=0 and x_position-int(key)<0:

return ratio[key]

if pre_number == 0:

pre_number=int(key)

return -1

2.2 在第一点判断整理落在哪个区间的方法,有两种,第一种比较简单,通过for循环遍历字典,从数字0开始,如果满足大于等于前区间小于后区间,则直接读取字典值作为奖励,方法没问题,但次数多了这种遍历效率不高;第二种使用二分法,相对复杂一点,但是算法效率高一些,需要额外写一个二分法的递归方法search,来判断随机数值落在哪个区间,以下是search方法和choujiang2方法:

search方法:这个方法尤为重要,可以说是经典递归的基础方法

#二分查询方法

def search(seq,number,lower=0,upper=None):

if upper==None:

upper = len(seq) - 1

#print('now lower is ',lower,' upper is ',upper)

if upper==lower:

#print('now lower is ',lower,' upper is ',upper)

return upper

else:

middle = (upper+lower)//2

if number>seq[middle]:

#print('now lower is ',middle+1,' upper is ',upper)

return search(seq,number,middle+1,upper)

else:

#print('now lower is ',lower,' upper is ',middle)

return search(seq,number,lower,middle)

choujiang2方法:

#第二种抽奖方式

ratio = {10:'a',30:'b',60:'c',100:'d'}

list_ratio = []

for i in ratio.keys():

list_ratio.append(i)

list_ratio = sorted(list_ratio)

def choujiang2():

#生成一个1-100的随机整数

x = np.random.randint(1,101,dtype='int')

i = search(list_ratio,x,lower=0)

key = list_ratio[i]

return ratio[key]

验证和效率

1、如何验证

验证一下概率是否符合我们的期望,代码如下:

def test_choujiang(func,*args,**kwargs):

Counter = {'a':0,'b':0,'c':0,'d':0}

n = 1000000

for i in range(n):

result = func(*args,**kwargs)

for key in Counter.keys():

if result==key:

Counter[key] += 1

print('a的概率是:{}'.format(Counter['a']/n))

print('b的概率是:{}'.format(Counter['b']/n))

print('c的概率是:{}'.format(Counter['c']/n))

print('d的概率是:{}'.format(Counter['d']/n))

%time test_choujiang(choujiang0)

2、比较不同抽奖方法的效率

采用二分法的抽奖方法,相对来说灵活性好且效率最高。

%time test_choujiang(choujiang0)

%time test_choujiang(choujiang1)

%time test_choujiang(choujiang2)

#投100万次的结果

输出结果:

a的概率是:0.098874

b的概率是:0.199867

c的概率是:0.300063

d的概率是:0.401196

Wall time: 7.98 s

a的概率是:0.10022

b的概率是:0.199958

c的概率是:0.300433

d的概率是:0.399389

Wall time: 17 s

a的概率是:0.100109

b的概率是:0.200252

c的概率是:0.300102

d的概率是:0.399537

Wall time: 4.54 s

python重复抽奖_用Python实现简单的抽奖程序相关推荐

  1. python 概率分布模型_使用python的概率模型进行公司估值

    python 概率分布模型 Note from Towards Data Science's editors: While we allow independent authors to publis ...

  2. python 时间序列预测_使用Python进行动手时间序列预测

    python 时间序列预测 Time series analysis is the endeavor of extracting meaningful summary and statistical ...

  3. python图像检测_用Python实现通过哈希算法检测图片重复的教程

    Iconfinder 是一个图标搜索引擎,为设计师.开发者和其他创意工作者提供精美图标,目前托管超过 34 万枚图标,是全球最大的付费图标库.用户也可以在 Iconfinder 的交易板块上传出售原创 ...

  4. python测试驱动开发_使用Python进行测试驱动开发的简单介绍

    python测试驱动开发 by Dmitry Rastorguev 德米特里·拉斯托格夫(Dmitry Rastorguev) 使用Python进行测试驱动开发的简单介绍 (A simple intr ...

  5. 最简单的python语言程序设计_编程中最简单的语言Python,这样学或许更容易

    最近微信小程序上面出了一个跳一跳的小游戏 大家有没有玩呀? 编程中最简单的语言Python,这样学或许更容易 分享之前我还是要推荐下我自己建的Python开发学习群:628979297,群里都是学Py ...

  6. python做线性回归_利用python实现简单的线性回归

    Python部落(python.freelycode.com)组织翻译,禁止转载,欢迎转发. Python部落(python.freelycode.com)组织翻译,禁止转载,欢迎转发. 用pytho ...

  7. python 免费空间_用python做大数据

    不学Python迟早会被淘汰?Python真有这么好的前景? 最近几年Python编程语言在国内引起不小的轰动,有超越Java之势,本来在美国这个编程语言就是最火的,应用的非常非常的广泛,而Pytho ...

  8. python希腊字母字符串_#10 Python字符串

    前言 通过上一节可知,Python6个序列的内置类型中,最常见的是列表和元组,但在Python中,最常用的数据类型却不是列表和元组,而是字符串.要想深入了解字符串,必须先掌握字符编码问题.因此本篇博文 ...

  9. 使用python预测基金_使用python先知3 1创建预测

    使用python预测基金 This tutorial was created to democratize data science for business users (i.e., minimiz ...

最新文章

  1. python使用符号#表示单行注释-Python中注释(多行注释和单行注释)的用法实例...
  2. 百度地图API开发概述
  3. Myeclipse学习总结(8)——Eclipse实用操作
  4. PL/SQL包(Package)
  5. 隐私与AI兼得,蚂蚁金服是如何做到的?
  6. axios请求接口http_超级简单好用的 Vue封装axios
  7. (转)测试端口通不通(四种方法)
  8. 输出保留3位小数的浮点数
  9. 海康工业相机USB接口连接Halcon21后,海康MVS客户端无法打开,如何解决
  10. Zynga 在韩国发布游戏《Harry Potter: Puzzles Spells》
  11. 【转载】printf打印是字体和背景带颜色的输出的方法
  12. python中如何绘制等边三角形
  13. 爱奇艺又涨价?注定想追剧就要成为SSSSVIP
  14. 黑苹果oc清除nvram_基于OpenCore0.6.1的黑苹果安装,小白也能看
  15. python神器排行_9款强大的Python工具包,第5款神器期待已久!
  16. ST的FOC库 2.0学习 霍尔矢量控制
  17. java飞秋源码,feiQiu 实现飞秋系统,和qq 类似,能够 客户端和服务器端 Java Develop 259万源代码下载- www.pudn.com...
  18. 重磅干货!你的爬虫会送你进监狱吗?
  19. 公众号数据监测工具从零运营公众号策略
  20. STEAM教育拥有过程和结果

热门文章

  1. 和年轻人一起嗨翻盛夏!梦百合婚礼季“好梦音乐节”首场圆满落幕
  2. AI神还原苏东坡相貌,古画上的苏东坡“活”了
  3. python insert into数据库
  4. visual studio code搭建Java环境 - 一步一个脚印详细教程
  5. [NOI Online #3 提高组] 水壶
  6. 沿着x轴旋转的html例子,CSS3旋转实例学习(附3D旋转实例)
  7. java生成MD5校验码(文件/字符串)
  8. 口碑营销,口口相传是营销人员必学的一门功课
  9. [网络工程师]-计算机硬件基础-Flynn分类法
  10. 我的第一个win32窗口程序------------记录