首页 > 编程语言 >猜数游戏,比较三种算法

猜数游戏,比较三种算法

时间:2024-06-13 23:01:51浏览次数:13  
标签:plt 猜数 min max random 算法 num 三种 steps

猜数游戏一般的规则如下:

一个人(通常称为出题者)在心中想一个特定范围内的数字,比如 1 到 100 之间。另一个人(通常称为猜题者)通过不断猜测来试图猜出这个数字。

猜题者每次猜测后,出题者会告知猜测的数字是大了还是小了,猜题者根据这些提示继续猜测,直到猜对为止。

以1 到 100 之间为例,分别使用黄金分割搜索法、二分法、随机数法计算猜出数字所用的步数,以图表的形式进行比较

import math
import matplotlib.pyplot as plt
import random

# 获取输入的最小值和最大值
min_num_input = input("请输入最小值:")
max_num_input = input("请输入最大值:")

# 将输入的字符串转换为整数,如果输入为空则使用默认值
min_num = int(min_num_input) if min_num_input else 1
max_num = int(max_num_input) if max_num_input else 100

if min_num > max_num:
    min_num, max_num = max_num, min_num  # 确保最小值小于等于最大值

# 黄金分割搜索法的结果列表和步数列表
numbers_golden = []
steps_golden = []
def golden_section_search(min_num=1, max_num=100):
    """
    黄金分割搜索法的函数
    遍历 1 到 100 的数字,使用黄金分割搜索法进行搜索
    """
    for num in range(min_num, max_num+1):
        low = 1
        high = 100
        step = 0
        golden_ratio = (1 + math.sqrt(5)) / 2
        while low <= high:
            ratio = high - low
            probe = low + ratio * (golden_ratio - 1)
            probe = int(probe)  # 确保猜测的数字为整数
            if probe == num:
                numbers_golden.append(num)
                steps_golden.append(step + 1)
                # print(f"Number {num} is guessed in {step + 1} steps.")
                break
            elif probe < num:
                low = probe + 1
            else:
                high = probe - 1
                step += 1
        
# 二分法的结果列表和步数列表
numbers_binary = []
steps_binary = []
def binary_search(min_num=1, max_num=100):
    """
    二分搜索法的函数
    遍历 1 到 100 的数字,使用二分搜索法进行搜索
    """
    for num in range(min_num, max_num+1):
        low = 1
        high = 100
        step = 0
        while low <= high:
            mid = int((low + high) // 2) # 确保猜测的数字为整数
            if mid == num:
                numbers_binary.append(num)
                steps_binary.append(step + 1)
                # 输出结果并结束循环
                # print(f"Number {num} is guessed in {step + 1} steps.")
                break
            elif mid < num:
                low = mid + 1
            else:
                high = mid - 1
                step += 1
        

# 随机猜测法的结果列表和步数列表,每次猜测后会缩小范围
numbers_random = []
steps_random = []
def random_guess_search(min_num=1, max_num=100):
    """
    随机猜测法的函数
    遍历 1 到 100 的数字,使用随机猜测法进行搜索,并在每次猜测后缩小范围
    """
    for num in range(min_num, max_num+1):
        step = 0
        low = 1
        high = 100
        while high - low > 1:  # 缩小猜测范围
            """
            在 high - low 的范围大于 1 时进行随机猜测
            """
            guess = random.randint(low, high)
            if guess == num:
                numbers_random.append(num)
                steps_random.append(step + 1)
                # 输出结果并结束循环
                # print(f"Number {num} is guessed in {step + 1} steps.")
                break
            elif guess < num:
                low = guess
            else:
                high = guess
                step += 1
        

# 绘制图表
golden_section_search(min_num, max_num)
binary_search(min_num, max_num)

# 绘制搜索方法的图表
plt.plot(numbers_golden, steps_golden, label='Golden Section Search')
plt.plot(numbers_binary, steps_binary, label='Binary Search')
# plt.plot(numbers_random, steps_random, label='Random Guess Search')
plt.xlabel('Numbers')
plt.ylabel('Steps')
plt.title('Comparison of Search Methods')
plt.legend()
plt.show()


# 计算随机数法与其他两种方法的差值
random_guess_search(min_num, max_num)
diff_golden = [steps_random[i] - steps_golden[i] for i in range(len(steps_random))]
diff_binary = [steps_random[i] - steps_binary[i] for i in range(len(steps_random))]

# 绘制差值图表
plt.subplot(212)
plt.plot(numbers_random, diff_golden, label='Difference with Golden Section Search')
plt.plot(numbers_random, diff_binary, label='Difference with Binary Search')
plt.xlabel('Numbers')
plt.ylabel('Difference in Steps')
plt.title('Difference in Steps for Random Guess Search')
plt.legend()
plt.show()

标签:plt,猜数,min,max,random,算法,num,三种,steps
From: https://blog.csdn.net/lucksea/article/details/139666133

相关文章

  • 代码随想录算法训练营第三十七天 | 56.合并区间 738.单调递增的数字
    56.合并区间题目链接文章讲解视频讲解思路:  按左区间排序;  遍历所有区间,如果当前区间的左边界小于等于上一个区间的右边界,则合并区间(新区间的左边界为上一个区间的左边界,新区间的右边界为上一个区间的有边界和当前区间有边界中较大的一个)classSolution{public:......
  • 代码随想录算法训练营第九天 |
    151.反转字符串中的单词题目:给你一个字符串s,请你反转字符串中单词的顺序。单词是由非空格字符组成的字符串。s中使用至少一个空格将字符串中的单词分隔开。返回单词顺序颠倒且单词之间用单个空格连接的结果字符串。注意:输入字符串s中可能会存在前导空格、尾随空......
  • 白冠鸡算法改进的深度极限学习机DELM的分类
    白冠鸡算法改进的深度极限学习机DELM的分类文章目录白冠鸡算法改进的深度极限学习机DELM的分类1.ELM原理2.深度极限学习机(DELM)原理3.白冠鸡算法4.白冠鸡算法改进DELM5.实验结果6.参考文献7.Matlab代码1.ELM原理ELM基础原理请参考:https://blog.csdn.net/u011835903/......
  • 金枪鱼群算法改进的深度极限学习机DELM的分类
    金枪鱼群算法改进的深度极限学习机DELM的分类文章目录金枪鱼群算法改进的深度极限学习机DELM的分类1.ELM原理2.深度极限学习机(DELM)原理3.金枪鱼群算法4.金枪鱼群算法改进DELM5.实验结果6.参考文献7.Matlab代码1.ELM原理ELM基础原理请参考:https://blog.csdn.net/u01......
  • 算法 - 搜索算法
    本文主要介绍算法中搜索算法的思想,主要包含BFS,DFS。搜索相关题目BFSDFS#搜索相关题目深度优先搜索和广度优先搜索广泛运用于树和图中,但是它们的应用远远不止如此。#BFS广度优先搜索的搜索过程有点像一层一层地进行遍历,每层遍历都以上一层遍历的结果作为起点,遍历一个......
  • 动态规划算法
    动态规划算法通常用于求解具有某种最优性质的问题。在这类问题中,可能会有许多可行解。每一个解都对应于一个值,我们希望找到具有最优值的解。动态规划算法与分治法类似,其基本思想也是将待求解问题分解成若干个子问题,先求解子问题,然后从这些子问题的解得到原问题的解。动态规划......
  • 回溯算法DFS
    Backtracking(回溯)属于DFS,本文主要介绍算法中Backtracking算法的思想。回溯算法实际上一个类似枚举的搜索尝试过程,主要是在搜索尝试过程中寻找问题的解,当发现已不满足求解条件时,就“回溯”返回,尝试别的路径。回溯法是一种选优搜索法,按选优条件向前搜索,以达到目标。但当探......
  • 【十大排序算法】计数排序
    数字在轻舞纷飞中,依次排列,如星辰般闪耀。文章目录一、计数排序二、发展历史三、处理流程四、算法实现五、算法特性六、小结推荐阅读一、计数排序计数排序是一种非比较型的排序算法,它根据待排序元素的值来确定每个元素之前的有序位置。它的基本思想是统计待排序元素......
  • 三种流行的基于 Git 的代码托管平台
    三种流行的基于Git的代码托管平台前言GitHubGitLabGitee总结前言GitLab、GitHub和Gitee是三种流行的基于Git的代码托管平台,但它们在功能和目标市场上有所不同。选择哪个平台取决于你的具体需求,例如是否需要国际化支持、是否需要自托管、以及是否需要符合特定......
  • m基于PSO-GRU粒子群优化长门控循环单元网络的电力负荷数据预测算法matlab仿真
    1.算法仿真效果matlab2022a仿真结果如下: 优化前:    优化后:    对比如下:   2.算法涉及理论知识概要       基于粒子群优化(ParticleSwarmOptimization,PSO)和长门控循环单元(GatedRecurrentUnit,GRU)网络的电力负荷预测算法,是一种融合......