龙空技术网

找最大麦穗 -- 用python编写数学和哲理验证程序

双戈传奇老师 18

前言:

目前大家对“python引入数学”大致比较注意,同学们都需要剖析一些“python引入数学”的相关文章。那么小编也在网络上汇集了一些有关“python引入数学””的相关知识,希望朋友们能喜欢,兄弟们快快来学习一下吧!

"""最优选择方案问题:包含数学和哲学苏格拉底和弟子们走到一片麦田里,对弟子们说,“你们从麦田的这一头走到那一头,中间可以拾起一株麦穗,我们看看谁能找到最大的麦穗。”他接着说 “当然,你们只有一次机会,一旦选定了,之后即便遇到更大的麦穗,也不能再采摘;而且你们也不能回头去采摘那些已经错过的大麦穗。” 弟子们听完之后,面面相觑。为了拿到最大的麦穗,你会采取什么样的策略呢?我用python写了个程序验证自己的策略。"""import randomimport pandas as pdfrom pyecharts.charts import Bar,Linefrom pyecharts import options as opts# def get_better_coin(n=20):#     """ 这是人工选择的函数,让你做选择,返回值是你所选择的麦穗是第几多 """#     ans = 0#     up_k = random.randint(1000,10000)#     down_k = random.randint(2000,11000)#     if up_k < down_k:#         up_k,down_k = down_k,up_k#     coins_list = [ random.randint(down_k,up_k) for i in range(n)]#     for i,coin in enumerate(coins_list,1):#         choice = input(f'第{i}株麦穗有{coin}颗,你要选吗?y/n: ')#         if choice in ['y','Y']:#             ans = coin#             break#     coins_list.sort(reverse=True)#     max_ = coins_list.index(ans) + 1#     print(f'你选的是{ans},是第{max_}大的数。')#     print(coins_list,'\n','#' * 20)#     return max_def get_better_coin(t,n=20):    """ 机器验证本人策略:假设你会遇到20株麦穗,根据标记前1-6的最大值maxnum6,在7-13中,如果有大于maxnum6者,则选;    如果没有,则标记1-13中的最大的第4株麦穗maxnum7_13,在14-20中,如果有大于等于maxnum7_13者,就选它,否则就选最后一株。返回值是你所选择的麦穗是第几多 """    up_k = random.randint(1000,10000)    down_k = random.randint(2000,11000)    if up_k < down_k:        up_k,down_k = down_k,up_k    coins_list = [ random.randint(down_k,up_k) for i in range(n)]    ans = coins_list[-1]    maxnum6 = max(coins_list[:6])    tem = coins_list[:13]    tem.sort(reverse=True)    maxnum7_13 = tem[3] # 经过十万次测试,tem[3]最佳,即13之后选前面13个中大于等于第四大的数。结果平均为3.23    for coin in coins_list[6:13]:        if coin >= maxnum6:            ans = coin            break    else:        for coin in coins_list[13:]:            if coin >= maxnum7_13:                ans = coin                break    coins_list_tem = coins_list.copy()    coins_list_tem.sort(reverse=True)    max_ = coins_list_tem.index(ans) + 1    print(f'在第{t}次测试中,你选的是{ans},是第{max_}大的数。')    print(coins_list)    print(coins_list_tem,'\n','#' * 20)    return max_def mk_bar(x,y):	  """绘制图表"""    bar = Bar()    bar.add_xaxis(x)    bar.add_yaxis(series_name='选中大小数的数量',y_axis=y,                  markline_opts=opts.MarkLineOpts(data=[opts.MarkLineItem(type_="min", name="最小值"),                                                        opts.MarkLineItem(type_="max", name="最大值"),                                                        opts.MarkLineItem(type_="average", name="平均值")]),                  )    bar.render('最佳选麦穗策略.html')n = int(input('你想测试多少次?'))my_choices = [ get_better_coin(i,20)  for i in range(1,n+1)]print(my_choices)avg = sum(my_choices) / nprint(f'你测试了{n}轮,每轮20个数,平均取到了{avg}大的数。')# 将结果进行聚合df = pd.DataFrame(my_choices).value_counts()df_describe = df.describe()print(df_describe)df.sort_index(inplace=True)print(df)x = list(df.index)y = list(df)mk_bar(x,y)"""经过程序10万次验证,平均可以选到排名3.2左右的大的麦穗,见下图"""

x轴1--20代表每株麦穗从大到小排名,1表示最大麦穗。y轴代表被选到的次数

10万次测试中,从大到小麦穗被选到的次数,如最大株麦穗选到32639次

数据说明:count表示每轮测试有20株麦穗

标签: #python引入数学