python - Python 3.x 短内存数猜测(编程/数学)
问题描述
(这可能是一个编程问题和一个数学问题,但先在这里发布。)
我做了一个简单的程序,在计算机和它自己之间玩猜谜游戏。它生成一个介于 0 到 100 之间的数字,然后从另一个函数中获取猜测。该程序可以工作,但非常不精确,因为猜测函数只知道最后一次猜测以及它应该猜测更高还是更低。(现在它只是在最后一次猜测和最低/最高界限之间随机化一个 int 。)
最简单的解决方案是 withif-else
但我更喜欢条件尽可能少的解决方案。
我想知道是否有办法让猜测函数在只知道最后一次猜测的情况下逐渐缩小猜测的宽度,是否应该猜测更高或更低以及猜测的最大和最小界限?
当前代码:
import random as rnd
def guess_me_computer(number = None, guess = 50, turns = 0, memory = []):
"""Guessing game between two computers.
Args:
number: Number to be guessed
guess: Guess made by computer
turns: How many guesses made so far
memory: List storing how many turns each run takes
"""
turns += 1
if number == None:
number = rnd.randint(0, 100)
if guess == number:
print("Correct! My number: {number} was guessed in {turns} tries!".format(number = number, turns = turns))
memory.append(turns) #Memory used in another testing function
return None
elif guess < number:
print("Wrong! Guess Higher!")
guess_me_computer(number = number, guess = guesser_computer(last_guess = guess, higher = True), turns = turns, memory = memory)
else:
print("Wrong! Guess Lower!")
guess_me_computer(number = number, guess = guesser_computer(last_guess = guess, higher = False), turns = turns, memory = memory)
def guesser_computer(last_guess = None, higher = None):
if higher:
return rnd.randint(last_guess, 100)
else:
return rnd.randint(0, last_guess)
非常欢迎有关问题本身和/或对写作的批评的任何和所有问题。
解决方案
虽然这对于学习递归来说不是一个大问题,但对于学习生成器,尤其是它们的.send()
方法来说,这可能是一个有趣的问题。下面的生成器仍然只知道最后的猜测,但它也会从调用它的程序中得到提示,无论猜测是太高还是太低:
from random import randint
def guess_me_computer(guesser):
number = randint(1, 100)
tries = 1
too_low = None
guess = next(guesser)
while True:
if guess == number:
print("Number: {} guessed in {} tr{}!".format(number, tries, ["ies", "y"][tries == 1]))
return
if guess < number:
print("Wrong! {} is too low! Guess Higher!".format(guess))
too_low = True
else:
print("Wrong! {} is too high! Guess Lower!".format(guess))
too_low = False
tries += 1
guess = guesser.send(too_low)
def guesser_computer(minimum=1, maximum=100):
while True:
guess = randint(minimum, maximum)
higher = yield guess
if higher:
minimum = guess + 1
else:
maximum = guess - 1
generator = guesser_computer()
guess_me_computer(generator)
推荐阅读
- ruby-on-rails-5 - 如何在rails中查看同名用户的详细信息?
- node.js - Nodejs 服务器被异步请求阻塞
- yii2 - Yii2 以一行而不是两行记录到 DB
- c# - 由于向下转换错误,使用继承进行映射不起作用
- ios - Xcode ld:找不到 -LFSCalendar 的库
- java - 从独立的 JFormDesigner 运行 GUI
- arrays - Redux Dispatch - 从数组中删除项目/不正确的数组长度输出
- java - Spring Boot 定义多个交换
- docker - Docker :: 如何在没有 docker hub 的情况下将 docker 映像从一个 mac 系统传输到另一个 mac 系统
- laravel - 从不同的子域加载 Vue.js 异步组件