成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

分享一道用Python基礎+蒙特卡洛算法實現排列組合的題目(附源碼)

開發 后端 算法
本文基于粉絲針對排列組合問題的提問,給出了一個利用Python基礎+蒙特卡洛算法的解決方案,基本上可以達到了粉絲的要求。

[[433465]]

大家好,我是Python進階者。這篇文章的題目真的是很難取,索性先取這個了,裝個13好了。

前言

前幾天在才哥交流群里,有個叫【Rick Xiang】的粉絲在Python交流群里問了一道關于排列組合的問題,初步一看覺得很簡單,實際上確實是有難度的。

題目是:一個列表中有隨機15個數,沒有重復值。從列表里面任意選5個數,如何選出來包含a, a+1的所有組合。a可以是15個數中的任意一個。

一、思路

這個問題看似簡單,思路正如上圖的【張老師】說的那樣,分兩步走,理論上來說,確實是可以實現。正常我們計算排列組合公式,用下圖中的組合公式計算是沒問題的。

但是這道題目的實現,涉及到用Python程序進行實現,當然計算一個數值,對于Python和我們來說并不難,難的是需要回歸排列組合原本的狀態,然后用程序進行實現。本文借用了群成員【有點意思】所說的蒙特卡洛算法和代碼進行實現,下面一起來看看吧!

這里引用【張老師】提及的第二種方案,先隨機取14個數,然后從14個隨機數中隨機取一個,然后自增1,作為第15個隨機數,之后再從這15個隨機數中進行隨機取5個隨機數,再進行if判斷,看看連續值是否同時存在同一個列表中,之后把滿足條件的列表append到一個空列表中去,最后再去用set集合去重,得到最后的結果。

二、解決方法

1)偽代碼

這里先給出【有點意思】大佬的偽代碼,這樣看上去大家也更加好理解一些,如下圖所示。其實下面這個代碼也不算是偽代碼,現在Python也支持中文變量,下面這個代碼也是完全可以跑起來的,只不過看上去要比下文中的純英文代碼要更加好理解一些。

下面給出具體的實現過程,這里給出5份代碼,歡迎大家積極嘗試。

2)代碼一

  1. # coding: utf-8 
  2. import random 
  3.  
  4. def quchong(list_data): 
  5.     list2 = [] 
  6.     for i in list_data: 
  7.         if i not in list2: 
  8.             list2.append(i) 
  9.     return list2 
  10.  
  11. # 從隨機的15個數值中隨機取出5個數,放到一個數組 
  12. # 生成不重復的14個隨機數 
  13. random_14 = [random.randint(0, 100) for i in range(14)]  # 這個寫法容易出現隨機值重復 
  14. random_14 = random.sample(range(100), 14) 
  15. print(random_14) 
  16. random_1 = random.choice(random_14) 
  17. random_2 = random_1 + 1 
  18. random_14.append(random_2) 
  19. random_15 = random_14 
  20. print(random_1, random_2) 
  21.  
  22. final_list = [] 
  23. for i in range(100): 
  24.     select = [random.choice(random_15) for j in range(5)] 
  25.     quchong_select = set(select
  26.     if random_1 in quchong_select and random_2 in quchong_select: 
  27.         final_list.append(quchong_select) 
  28. fina_result = quchong(final_list) 
  29. print(len(fina_result)) 

乍一看,這個方法確實可以實現,但是這里會有一個小bug,那就是random.randint()函數生成的隨機中會有重復值,而題目要求是生成不重復的隨機值。那么這個問題,將在代碼二中得到解決。

3)代碼二

使用random.sample()函數,這個函數可以隨機產生隨機值,而且不會重復,還是很奈斯的。另外,使用了numpy.random.choice()函數,可以直接選擇隨機的5個數,效率比代碼一更高一些。

  1. # -*- coding: utf-8 -*- 
  2. import numpy as np 
  3. import random 
  4.  
  5. def quchong(list_data): 
  6.     list2 = [] 
  7.     for i in list_data: 
  8.         if i not in list2: 
  9.             list2.append(i) 
  10.     return list2 
  11.  
  12. # 從隨機的15個數值中隨機取出5個數,放到一個數組 
  13. # 生成不重復的14個隨機數 
  14. random_14 = random.sample(range(100), 14) 
  15. print(random_14) 
  16. random_1 = random.choice(random_14) 
  17. random_2 = random_1 + 1 
  18. random_14.append(random_2) 
  19. random_15 = random_14 
  20. print(random_1, random_2) 
  21.  
  22. final_list = [] 
  23. for i in range(100): 
  24.     sub_random_data = np.random.choice(random_15, 5) 
  25.     quchong_select = set(sub_random_data) 
  26.     if random_1 in quchong_select and random_2 in quchong_select: 
  27.         final_list.append(quchong_select) 
  28. fina_result = quchong(final_list) 
  29. print(len(fina_result)) 

4)代碼三

代碼三主要是在代碼一和代碼二的基礎上加了一些函數,使得讀起來更加的有邏輯性和層次感。

  1. # -*- coding: utf-8 -*- 
  2. # 模塊化 
  3. import random 
  4. import numpy as np 
  5.  
  6. # 從隨機的15個數值中隨機取出5個數,放到一個數組,生成不重復的14個隨機數 
  7. def get_random15(): 
  8.     random_14 = random.sample(range(1000), 14) 
  9.     print(random_14) 
  10.     random_1 = random.choice(random_14) 
  11.     random_2 = random_1 + 1 
  12.     random_14.append(random_2) 
  13.     random_15 = random_14 
  14.     print(random_1, random_2) 
  15.     get_final_result(random_1, random_2, random_15) 
  16.  
  17.  
  18. def get_final_result(random_1, random_2, random_15): 
  19.     final_list = [] 
  20.     for i in range(1000): 
  21.         sub_random_data = np.random.choice(random_15, 5) 
  22.         quchong_select = set(sub_random_data) 
  23.         if random_1 in quchong_select and random_2 in quchong_select: 
  24.             final_list.append(quchong_select) 
  25.     fina_result = quchong(final_list) 
  26.     print(len(fina_result)) 
  27.  
  28.  
  29. def quchong(list_data): 
  30.     list2 = [] 
  31.     for i in list_data: 
  32.         if i not in list2: 
  33.             list2.append(i) 
  34.     return list2 
  35.  
  36.  
  37. if __name__ == '__main__'
  38.     get_random15() 

5)代碼四

細心的朋友可能已經發現了一個問題,在隨機從np.random.choice(random_15, 5)取值的時候,也會取出重復的值,這樣也是不符合要求的,這里給出了一個方案,從15個隨機數中取出一個之后,然后remove掉這個取出的數,重新去剩下的列表中去取,這樣就完美的避開了這個問題。

  1. # 模塊化 
  2. import random 
  3. import numpy as np 
  4.  
  5.  
  6. # 取出隨機的15個數值 
  7. def get_random15(): 
  8.     for i in range(2): 
  9.         random_15 = random.sample(range(20), 15) 
  10.         # print(random_15) 
  11.         get_random5(random_15) 
  12.  
  13.  
  14. # 遍歷隨機的15個數值,取相鄰的兩個隨機數,并調用函數進行處理 
  15. def get_random5(random_15): 
  16.     random_5 = [] 
  17.     # 遍歷5次,從random_15中取5個不同的元素 
  18.     for i in range(5): 
  19.         random_data = np.random.choice(random_15) 
  20.         random_5.append(random_data) 
  21.         random_15.remove(random_data) 
  22.     # print(random_5) 
  23.     for num in random_5: 
  24.         random_1 = num 
  25.         random_2 = random_1 + 1 
  26.         get_final_result(random_1, random_2, random_5) 
  27.  
  28.  
  29. # 判斷相鄰的兩數值是否同時存在隨機的15個數值的列表中,如果滿足要求,就存到一個列表中,并調用去重函數 
  30. def get_final_result(random_1, random_2, random_5): 
  31.     final_list = [] 
  32.     if random_1 in random_5 and random_2 in random_5: 
  33.         print(random_5) 
  34.         final_list.append(random_1) 
  35.     result = quchong(final_list) 
  36.     print(result) 
  37.  
  38.  
  39. # 針對得到的所有列表,進行去重處理 
  40. def quchong(list_data): 
  41.     list = [] 
  42.     for i in list_data: 
  43.         if i not in list: 
  44.             list.append(i) 
  45.     return list 
  46.  
  47.  
  48. if __name__ == '__main__'
  49.     get_random15() 

代碼寫到這里,已經比之前的方案要好很多了,比之前的三個代碼都要嚴謹一些,但是仍然存在不足。雖然解決了隨機生成重復性的問題,也解決了隨機從random_15中取出重復數的問題,但是弊端還是存在的。這個代碼遍歷挺多的,復雜度倒是正常,但是輸出的格式不太好看,沒有達到預期。這里我只是遍歷了2次,而且隨機數我只是開放到0-20,如果循環次數增多,數值越多的話,計算起來速度可就不好說了。

6)代碼五

經過【有點意思】大佬和我的共同努力,現在祭出終極版本,這個版本是迄今為止,針對該問題寫出的最嚴謹的一個版本了,代碼如下。

  1. # -*- coding: utf-8 -*- 
  2. # 模塊化 
  3. import random 
  4. import numpy as np 
  5. import time 
  6.  
  7.  
  8. # 取出隨機的15個數值 
  9. def get_random15(): 
  10.     for i in range(100000): 
  11.         random_15 = random.sample(range(2000), 15) 
  12.         # print("隨機15數=",random_15,len(random_15)) 
  13.         get_random5(random_15) 
  14.  
  15.  
  16. # 遍歷隨機的15個數值,取相鄰的兩個隨機數,并調用函數進行處理 
  17. def get_random5(random_15): 
  18.     random_5 = [] 
  19.     # 遍歷5次,從random_15中取5個不同的元素 
  20.     for i in range(5): 
  21.         random_data = np.random.choice(random_15) 
  22.         random_5.append(random_data) 
  23.         random_15.remove(random_data) 
  24.     # print("random_5=",random_5) 
  25.     # print("random_15=",random_15) 
  26.     for num in random_5: 
  27.         random_1 = num 
  28.         random_2 = random_1 + 1 
  29.         # print(random_1,random_2) 
  30.         get_final_result(random_1, random_2, random_5) 
  31.  
  32.  
  33. # 判斷相鄰的兩數值是否同時存在隨機的15個數值的列表中,如果滿足要求,就存到一個列表中,并調用去重函數 
  34. def get_final_result(random_1, random_2, random_5): 
  35.     final_list = [] 
  36.     if random_1 in random_5 and random_2 in random_5: 
  37.         # print(random_5) 
  38.         final_list.append(random_5) 
  39.     result = quchong(final_list)     
  40.      
  41.     if result:         
  42.         if len(result[0]) == 5: 
  43.             # print(random_1,random_2) 
  44.             # print("result=",result) 
  45.             final_result.append(result) 
  46.  
  47.  
  48. # 針對得到的所有列表,進行去重處理 
  49. def quchong(list_data): 
  50.     list = [] 
  51.     for i in list_data: 
  52.         if i not in list: 
  53.             list.append(i) 
  54.     return list 
  55.  
  56.  
  57. if __name__ == '__main__'
  58.     start_time = time.time() 
  59.     global final_result 
  60.     final_result = [] 
  61.     get_random15() 
  62.  
  63.     final_result = quchong(final_result) 
  64.     print("共%d個符合題意的列表" % len(final_result)) 
  65.     print("分別是:%s" % final_result) 
  66.  
  67.     end_time = time.time() 
  68.     used_time = end_time - start_time 
  69.     print() 
  70.     print("本次程序用時:{}".format(time.strftime('%H(小時):%M(分鐘):%S(秒)'time.gmtime(used_time)))) 

這個代碼運行之后,可以看到符合題意列表的具體個數,還有具體的列表數值,還有耗時時間。

經過測試,在10萬次循環以內,符合要求的數據大概有1000左右,運行時間也只是秒級的。如果繼續擴大循環力度,程序的復雜度會更加大,更加貼近理論的排列組合值,因為耗時太長,這里不再做測試,感興趣的話,自己可以改下參數進行調試。

三、總結

我是Python進階者。本文基于粉絲針對排列組合問題的提問,給出了一個利用Python基礎+蒙特卡洛算法的解決方案,基本上可以達到了粉絲的要求。

不過話說回來,這個方案還是存在一定的弊端的,隨著循環次數越多,隨機數越大,排列組合數就會越多,運行的時間也就會越長,當然得到的數據也就更加的精準了。

 

責任編輯:姜華 來源: Python爬蟲與數據挖掘
相關推薦

2021-11-08 08:51:36

Python算法Python基礎

2021-11-10 07:47:49

Python源碼代碼

2021-08-20 10:12:35

Python蒙特卡洛股票

2024-12-13 16:11:01

2025-02-24 10:15:00

2025-05-26 08:52:00

2018-03-13 16:04:45

Promise執行順序

2021-03-02 11:29:50

算法算法分析前端

2021-08-21 14:30:58

機器學習bilibili股價

2021-08-23 11:15:20

Python機器學習bilibili

2009-08-11 15:09:44

一道面試題C#算法

2025-02-13 09:34:13

2012-05-18 11:17:58

Java多線程

2023-04-12 15:58:58

2024-05-09 08:33:33

2024-08-19 08:45:00

開源模型

2009-08-11 10:12:07

C#算法

2009-08-11 14:59:57

一道面試題C#算法

2024-03-18 13:32:11

2023-10-27 13:05:23

模型訓練
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 免费一区 | 欧美爱爱视频网站 | 日韩国产免费观看 | 国产精品一区二区不卡 | 午夜影院在线观看 | 一区二区三区精品 | 国产在线精品一区二区 | 国产精品视频网站 | 一区二区三区精品视频 | 日韩在线精品强乱中文字幕 | 亚洲乱码一区二区三区在线观看 | 日韩不卡视频在线观看 | 久久久成人网 | 国产欧美精品一区 | 亚洲精品视频在线观看免费 | 亚洲欧美日韩精品久久亚洲区 | 日韩高清中文字幕 | 亚洲精品女人久久久 | 成人性视频免费网站 | 亚洲人成人一区二区在线观看 | 国产午夜精品一区二区 | 日韩av一区二区在线观看 | 亚洲精品二区 | 午夜免费视频观看 | 日韩精品视频在线 | 日韩三级视频 | 久久久看| 午夜影院网站 | 欧美亚洲在线 | 性一交一乱一透一a级 | 欧美九九 | 午夜视频一区 | 久久精品亚洲一区 | 精品国产乱码久久久久久丨区2区 | 91在线视频播放 | 无码日韩精品一区二区免费 | 国产成人精品一区二区三区在线 | 亚洲精品www | 美女黄网站 | 久久久久久久久久毛片 | 一级毛片网 |