大家好,我是进阶Pythonista。你惊喜吗?上周刚发了这篇文章:分享一道使用Python基础知识+蒙特卡洛算法的排列组合题目(附源码),今天还有一篇,叫做番外篇!事实上,今天我想和大家分享[🌑(这就是月球背面)】大佬的解法太神奇了!回顾一下前几天的情况,在菜哥交流群里,Python交流群里有个叫【RickXiang】的粉丝问了一个关于排列组合的问题。乍一看觉得很简单,其实确实很难。题目是:一个列表中有15个没有重复值的随机数。从列表中随机选择5个数字,如何选择包括a、a+1在内的所有组合。a可以是15个数字中的任何一个。关于思路和解决方案,本文分享一个使用Python基础+蒙特卡罗算法的排列组合题目(附源码)。提供了【张老师】和【有趣的事】的思路和解决方案。一共5个代码,足够大家学习了,感兴趣的小伙伴快去学习吧,干货满满。2.新代码上周五,我发表了这篇原创文章,分享了一个使用Python基础+蒙特卡洛算法实现排列组合的题目(附源码)。很庆幸有粉丝亲身实践,给出了建设性的意见。方案,如下图所示。这里先给出[🌑的伪代码(这是月亮的背面)】,让大家更好的理解。#-*-coding:utf-8-*-#modularimportrandomimportnumpyasnpimporttime#取出15个随机值defget_random15():random_array=[np.array(random.sample(range(2000),15))foriinrange(100000)]random5={get_random5(random15)forrandom15inrandom_array}return[iforiinrandom5ifi]#遍历15个随机值,取相邻的两个随机数,判断后返回满足条件的值defget_random5(random_15):random_5=set(random_15[random.sample(range(15),5)])#np.array的索引替换choice的值#利用set特征判断元素是否包含给定元素random_5_resp={Trueiflen(random_5.intersection({num,num+1}))==2elseFalsefornuminrandom_5}returntuple(random_5)ifTrueinrandom_5_respelse()if__name__=='__main__':start_time=time.time()final_result=get_random15()print("一共%d个列表符合题意"%len(final_result))print("分别为:%s"%final_result)end_time=time.time()used_time=end_time-start_timeprint()print("时间s在这个程序中pent:{}".format(time.strftime('%H(hour):%M(minutes):%S(seconds)',time.gmtime(used_time))))这段代码写的真好,对于没有Python基础的朋友来说一定很难。我看的时候也觉得有点难以吸收。我需要多读几遍才能理解。这段代码在亲测有效。使用前面的代码大约需要12秒,而使用这个代码只需1.5秒。他在这里做了三个优化。一是从15个数中随机抽取5个值花了很长时间。这里利用numpy.array的特性来优化代码。在科学计算中,可以节省很多周期。语句和代码比Python列表更易于使用。Python列表不能直接操作,但是NumpyArray可以直接操作;二是把之前的去重功能删掉了,这里他也用set来优化,所以也节省了这方面的时间;三是使用集合交集运算(Intersection),与前面的if判断相比,节省了时间。想到这里,不得不感叹,【人生苦短,我用python】!3.综上所述,我是Python进阶。本文根据爱好者对排列组合的疑问,给出了使用Python基础+蒙特卡洛算法的解决方案,基本可以满足爱好者的要求。不过话说回来,虽然这个解决方案是当下最好的,但并不总是最好的。
