#什么是二分法
#用二分法猜电脑随机数
#用二分法猜用户所想的数
对于区间[a,b]上连续不断且f(a)·f(b)<0的函数y=f(x),通过不断地把函数f(x)的零点所在的区间一分为二,使区间的两个端点逐步逼近零点,进而得到零点近似值的方法叫二分法。
二分法,顾名思义就是一分为二的方法。设[a,b]为R的闭区间,逐次二分法就是造出如下的区间序列([an,bn]):a0=a,b0=b,且对任一自然数n,[an+1,bn+1]或者等于[an,cn],或者等于[cn,bn],其中cn表示[an,bn]的中点.
二分法在计算机中的应用主要在算法上,用于数据的查找:
假设数据是按升序排列,对于给定值num,先取序列中间值n
若num=n,则查找成功
若num 若num>n,则取最大值到n的中间值和num进行比较 循环往复,知道num=n 二分法我们已经有所了解,我们也知道,生成随机数的函数为random.randint(min,max),其中min和max分别是随机数的最大值和最小值。 定义相关变量,其中max,min为随机数取值范围,guess为猜测的数字,secret为随机数,time为猜测次数 进入循环由于存在secret等于区间中值的可能,因此要先给time+1,再分情况讨论。循环猜测直到猜对结束循环 这个程序的思路和上面的大致相同,只是多了让用户判断的环节 由于我之前在测试程序的时候发现,如果猜的数字时最大值时,guess时永远猜不出来的,这是我们的算法有了漏洞,因为我们用的int()函数只取整数部分,因此我写了floint_carry()函数,作用是,当小数部分不为0时,就给整数部分+1。这样guess也可以取到最大值了。 这是floint_carry()函数部分 ok,这就是“用二分法编写猜数字游戏(含:猜电脑随机数,和用户自己想的数字)python”的全部内容啦,新手上路请多多指教,如果有不对的地方,还请大佬不吝赐教。2.用二分法猜电脑随机数
import random
max = 10000*1000
min = 0
guess = int((max - min)/2) + min
secret = random.randint(min,max)
time = 0
while 1 :
time = time + 1
if guess == secret :
print("该随机数为{0},猜了{1}次".format(guess,time))
break
elif guess < secret :
min= guess
guess = int ((max - min) / 2) + min
else :
max = guess
guess = int((max - min) / 2) + min
print("结束")
3.用二分法猜用户所想的数
import sys
sys.path.append('D:\\study\\python\\floint') #括号内容为文件的绝对路径
import floint
print("在心里想一个任意大小的整数")
min,max = eval(input("请输入数字的取值范围(由小到大,用逗号隔开):"))
guess = int((max - min) / 2) + min
time = 0
while 1 :
time += 1
print("你想的数字是{},对吗?".format(guess))
heart = input("如果相同,请按‘=’\n如果大于你想的数,请按‘>’\n如果小于你想的数,请按‘<’\n")
if heart == '=' :
print("我只猜了{}次就猜到了,请夸奖我".format(time))
break
elif heart == '>' :
max = guess
guess = int((max - min) / 2) + min
elif heart == '<' :
min = guess
guess = floint.floint_carry((max-min) / 2) +min
else :
print("滚犊子,你他娘的真是个人才,让你整'{}'了吗?".format(heart))
time -= 1
#小数取整进位
def floint_carry( x) :
x = float ( x )
y = int (x)
if x - y == 0 :
return y
else :
return (y + 1)