python 有n个数 随机赋值 使得和为1_小白的第一个python

最近入坑了python,说什么人生苦短,才发现python的高效。

本人有过C语言基础,2012年还拿过全国C语言程序设计二等奖(自嗨一下),然后就在再没有然后了,所谓业精于勤荒于嬉,我属于后半句。而今2019年,时隔七年,已年近而立,作为兴趣,重操旧业。

我是在中国大学MOOC的手机APP上自学的,下载了Qpython3L辅助学习,虽然比电脑敲代码慢,但足够了。

学了点皮毛就开始卖弄,新鲜热乎。

首先声明,刚学了数据类型,time库以及random库的基础知识。

平时喜欢买大乐透,就突发奇想,编一个机选大乐透的程序。

一 问题分析

大乐透有红球区和蓝球区,红球5个不同数字,在1-35,蓝球2个,1-12。

根据IPO模型,需要输入。那么核心就是要编写一个函数,choose(m,n),类似于排列组合中的组合。其中m为范围,n为所选个数。当然,函数的返回值为字符串,例如:08 35 22 21 07等。输出格的话,就是一个字符串。

那么开始吧

二 编写代码

这是我最初的代码,为方便阅读,加了注释,#后面为注释。

import time as t #调用时间库命名为t

import random as r #调用随机数库命名r

s="" #定义空字符串,存结果

j=0 #多余的变量,改了没删除

def seekf(st,c,m): #排他函数保证球号不同

f=0 #旗帜

st_list=st.split(" ") #st按照空格分割列表

for i in range(m): # 循环

if c==st_list[i]: #判断c和列表项同否

f=1 #相同表明重复,立flag

break #退出当前循环

return f # 返回旗帜,0表明无重复

def choose(m,n): #定义组合函数

res="" #存结果

j=0 #循环变量

while j<n: #循环n次,就是选n个数

temp=str(int(r.random()*1000)%(m-1)+1) #r.random()产生随机小数(0-1之间),*1000然后int()变成整数后,%对m-1取余,+1。这样确保在1-m之间获得整数。最后str()变成字符串赋值给temp

#print(temp)

if seekf(res,temp,j)==0: #判断temp没有重复

res+="{:0>2} ".format(temp)#将一位数前面填充0变成两位数后,追加空格,补加在res字符串后面,如res="12 ",temp="13"运算后变为"12 13 "

j+=1 #循环变量增加1,如果不同就不增

return res #返回字符串

print("开始摇大乐透号码:")

while 1:

red=choose(35,5) #35选5

blue=choose(12,2) #12选2

t.sleep(0.05) #程序休眠0.05秒

print("r"+"{} {}".format(red,blue),end="") #在同一行循环覆盖输出,这样输入回车就显示下一行

b008670253269dfbfd31caf1035adcdf.png
运行结果https://www.zhihu.com/video/1133986821154332672

很有成就感。

三 精简代码

一般情况到这里就结束了,但是我是个追求简单高效的人。突然发现,自己这个排他函数其实一句话就行了:temp in res

def seekf(st,c,m): #排他函数保证球号不同

f=0 #旗帜

st_list=st.split(" ") #st按照空格分割列表

for i in range(m): # 循环

if c==st_list[i]: #判断c和列表项同否

f=1 #相同表明重复,立flag

break #退出当前循环

return f # 返回旗帜,0表明无重复

也就是说把原文加粗的部分替换成:if not (temp in res):就成立了。意思是子字符串temp不包含于res。但问题在于"8"也包含于"18",所以在此之前将"8"转换为"08",也就是temp="{:0>2} ".format(temp)

于是程序精简。

import time as t #调用时间库命名为t

import random as r #调用随机数库命名r

def choose(m,n): #定义组合函数

res="" #存结果

j=0 #循环变量

while j<n: #循环n次,就是选n个数

temp=str(int(r.random()*1000)%(m-1)+1)

temp="{:0>2} ".format(temp)

if not (temp in res): #判断temp不重复

res+=temp #res尾部增加temp

j+=1 #循环变量增加1

return res #返回字符串

print("开始摇大乐透号码:")

while 1:

red=choose(35,5) #35选5

blue=choose(12,2) #12选2

t.sleep(0.05) #程序休眠0.05秒

print("r"+"{} {}".format(red,blue),end="")

好咯,以上就是本次编程心得,虽然微不足道,但也小有成就。(PS:未婚妻正不开心呢,赶紧安慰去了)


版权声明:本文为weixin_39633891原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。