Python の基本 + モンテカルロ アルゴリズム (ソース コード付き) を使用して、順列と組み合わせに関する質問を共有します。

Python の基本 + モンテカルロ アルゴリズム (ソース コード付き) を使用して、順列と組み合わせに関する質問を共有します。

[[433465]]

みなさんこんにちは。私は Python の専門家です。この記事のタイトルを考えるのは本当に難しいので、とりあえずこれをつけて、すごいふりをすることにします。

序文

数日前、Caigeコミュニケーショングループで、[Rick Xiang]というファンがPythonコミュニケーショングループでの順列と組み合わせについて質問しました。一見とても簡単に思えますが、実際にはかなり難しいです。

タイトルは次のとおりです: リストには重複する値のない 15 個のランダムな数字があります。リストからランダムに 5 つの数字を選択し、a と a+1 のすべての可能な組み合わせを見つけます。 a は 15 個の数字のうちのいずれかになります。

1. アイデア

この問題は簡単そうに見えますが、考え方は上の図で張先生が言った通りで、2つのステップに分かれています。理論的には達成可能です。通常は順列と組み合わせの式を計算しますが、下図の組み合わせ式を使用しても問題ありません。

ただし、この問題の実装には Python プログラムの使用が必要です。もちろん、値の計算は Python にとっても私たちにとっても難しいことではありません。難しいのは、順列と組み合わせを元の状態に戻してからプログラムで実装する必要があることです。この記事は、グループメンバー [interesting] が実装に言及したモンテカルロ アルゴリズムとコードを借用しています。一緒に見てみましょう。

ここでは、[Teacher Zhang]が言及した2番目の解決策を引用します。まず、14個の数字をランダムに選択し、次に14個の乱数から1つをランダムに選択し、15番目の乱数として1を増やします。次に、これらの15個の乱数から5つの乱数を選択し、if判定を実行して、連続する値が同時に同じリストに存在するかどうかを確認します。次に、条件を満たすリストを空のリストに追加し、最後にセットコレクションを使用して重複を削除して最終結果を取得します。

2. 解決策

1) 擬似コード

下の図のように、より理解しやすいと思われる[興味深い]マスターの疑似コードを以下に示します。実は、以下のコードは擬似コードではありません。現在、Python は中国語の変数もサポートしており、以下のコードも実行できますが、以下の純粋な英語のコードよりも理解しやすいように見えます。

具体的な実装手順は以下の通りです。5つのコードを紹介しますので、ぜひ積極的に試してみてください。

2) コード1

  1. # コーディング: utf-8
  2. ランダムにインポート
  3.  
  4. def quchong(list_data):
  5. リスト2 = []
  6. list_data内のiの場合:
  7. もし私 リスト2:
  8. リスト2.追加(i)
  9. リスト2を返す
  10.  
  11. # 15個のランダムな値から5つの数字をランダムに選択し、配列に格納します
  12. # 14個の重複しない乱数を生成する
  13. random_14 = [random.randint(0, 100) for i in range(14)] # このメソッドはランダムな値の重複が発生しやすい
  14. random_14 = ランダムサンプル(範囲(100), 14)
  15. 印刷(ランダム14)
  16. random_1 = ランダム.選択(random_14)
  17. ランダム_2 = ランダム_1 + 1
  18. ランダム_14.追加(ランダム_2)
  19. ランダム_15 = ランダム_14
  20. 印刷(ランダム1、ランダム2)
  21.  
  22. 最終リスト = []
  23. iが範囲(100)内にある場合:
  24. select = [random.choice(random_15)範囲(5)内のjについて]
  25. quchong_select =設定(選択)
  26. quchong_selectrandom_1 があり quchong_selectrandom_2 がある場合:
  27. final_list.append(quchong_select)
  28. fina_result = quchong(final_list)
  29. 印刷(len(fina_result))

一見すると、この方法は確かに実装できますが、ここには小さなバグがあります。つまり、random.randint() 関数によって生成されたランダム値には重複した値が存在し、質問では重複しないランダム値の生成が求められます。この問題はコード 2 で解決されます。

3) コード2

random.sample() 関数を使用すると、繰り返しなしでランダムな値を生成できるので非常に便利です。さらに、numpy.random.choice() 関数を使用すると、5 つの乱数を直接選択できるため、コード 1 よりも効率的です。

  1. # -*- コーディング: utf-8 -*-
  2. numpyをnpとしてインポートする
  3. ランダムにインポート
  4.  
  5. def quchong(list_data):
  6. リスト2 = []
  7. list_data内のiの場合:
  8. もし私 リスト2:
  9. リスト2.追加(i)
  10. リスト2を返す
  11.  
  12. # 15個のランダムな値から5つの数字をランダムに選択し、配列に格納します
  13. # 14個の重複しない乱数を生成する
  14. random_14 = ランダムサンプル(範囲(100), 14)
  15. 印刷(ランダム_14)
  16. random_1 = ランダム.選択(random_14)
  17. ランダム_2 = ランダム_1 + 1
  18. ランダム_14.追加(ランダム_2)
  19. ランダム_15 = ランダム_14
  20. 印刷(ランダム1、ランダム2)
  21.  
  22. 最終リスト = []
  23. iが範囲(100)内にある場合:
  24. サブランダムデータ = np.random.choice(random_15, 5)
  25. quchong_select =設定(サブランダムデータ)
  26. quchong_selectrandom_1 があり quchong_selectrandom_2 がある場合:
  27. final_list.append(quchong_select)
  28. fina_result = quchong(final_list)
  29. 印刷(len(fina_result))

4) コード3

コード 3 は主にコード 1 とコード 2 に基づいていくつかの機能を追加し、より論理的で階層化された読みやすさを実現しています。

  1. # -*- コーディング: utf-8 -*-
  2. # モジュール性
  3. ランダムにインポート
  4. numpyをnpとしてインポートする
  5.  
  6. # 15 個のランダムな値から 5 つの数字をランダムに選択し、配列に入れて、重複しない 14 個のランダムな数字を生成します。
  7. get_random15() を定義します:
  8. random_14 = ランダムサンプル(範囲(1000), 14)
  9. 印刷(ランダム14)
  10. random_1 = ランダム.選択(random_14)
  11. ランダム_2 = ランダム_1 + 1
  12. ランダム_14.追加(ランダム_2)
  13. ランダム_15 = ランダム_14
  14. 印刷(ランダム1、ランダム2)
  15. 最終結果を取得します(ランダム1、ランダム2、ランダム15)
  16.  
  17.  
  18. get_final_result を定義します(random_1、random_2、random_15):
  19. 最終リスト = []
  20. iが範囲(1000)内にある場合:
  21. サブランダムデータ = np.random.choice(random_15, 5)
  22. quchong_select =設定(サブランダムデータ)
  23. quchong_selectrandom_1 があり quchong_selectrandom_2 がある場合:
  24. final_list.append(quchong_select)
  25. fina_result = quchong(final_list)
  26. 印刷(len(fina_result))
  27.  
  28.  
  29. def quchong(リストデータ):
  30. リスト2 = []
  31. list_data内のiの場合:
  32. もし私 リスト2:
  33. リスト2.追加(i)
  34. リスト2を返す
  35.  
  36.  
  37. __name__ == '__main__'の場合:
  38. get_random15()

5) コード4

注意深い友人は問題を発見したかもしれません。np.random.choice(random_15, 5) からランダムに値を取得すると、重複した値も取得され、要件を満たしません。ここに解決策があります。15 個のランダムな数字から 1 つを取得した後、取得した数字を削除し、残りのリストから再度取得します。これにより、この問題が完全に回避されます。

  1. # モジュール性
  2. ランダムにインポート
  3. numpyをnpとしてインポートする
  4.  
  5.  
  6. # 15個のランダムな値を取り出す
  7. get_random15() を定義します:
  8. iが範囲(2)内にある場合:
  9. random_15 = ランダムサンプル(範囲(20), 15)
  10. # 印刷(ランダム15)
  11. get_random5(ランダム15)
  12.  
  13.  
  14. # 15個のランダムな値を走査し、2つの隣接するランダムな数値を取得し、処理用の関数を呼び出します
  15. get_random5(random_15)を定義します。
  16. ランダム_5 = []
  17. # 5回走査し、random_15から5つの異なる要素を取得します
  18. iが範囲(5)内にある場合:
  19. ランダムデータ = np.random.choice(random_15)
  20. random_5.append(ランダムデータ)
  21. random_15.remove(ランダムデータ)
  22. # 印刷(ランダム5)
  23. random_5numの場合:
  24. ランダム_1 = 数値
  25. ランダム_2 = ランダム_1 + 1
  26. 最終結果を取得します(ランダム1、ランダム2、ランダム5)
  27.  
  28.  
  29. # 15個のランダムな値のリストに隣接する2つの値が同時に存在するかどうかを判断します。要件を満たしている場合は、リストに保存し、重複排除関数を呼び出します
  30. def get_final_result(ランダム1、ランダム2、ランダム5):
  31. 最終リスト = []
  32. random_1 がrandom_5に含まれ random_2が random_5に含まれる場合:
  33. 印刷(ランダム5)
  34. final_list.append(ランダム1)
  35. 結果 = quchong(final_list)
  36. 印刷(結果)
  37.  
  38.  
  39. # 取得したすべてのリストに対して重複排除処理を実行する
  40. def quchong(リストデータ):
  41. リスト = []
  42. list_data内のiの場合:
  43. もし私 リスト:
  44. リストに追加(i)
  45. 返品リスト
  46.  
  47.  
  48. __name__ == '__main__'の場合:
  49. get_random15()

ここでのコードは、以前のソリューションよりもはるかに優れており、以前の 3 つのコードよりも厳密ですが、まだいくつかの欠点があります。ランダム生成の繰り返しの問題と random_15 から繰り返し数字をランダムに抽出する問題は解決されましたが、欠点はまだ残っています。このコードには多くのトラバーサルがあり、複雑さは正常ですが、出力形式はあまり良くなく、期待を満たしていません。ここでは2回だけトラバースし、乱数を0~20に開いただけです。ループ回数が増えて値の数が増えると、計算速度はなんとも言えなくなります。

6) コード5

[Somewhat Interesting] と私の共同作業の結果、最終バージョンがリリースされました。このバージョンは、この問題に対してこれまでに書かれた中で最も厳密なバージョンです。コードは次のとおりです。

  1. # -*- コーディング: utf-8 -*-
  2. # モジュール性
  3. ランダムにインポート
  4. numpyをnpとしてインポートする
  5. インポート時間 
  6.  
  7.  
  8. # 15個のランダムな値を取り出す
  9. get_random15() を定義します:
  10. iが範囲(100000)内にある場合:
  11. random_15 = ランダムサンプル(範囲(2000), 15)
  12. # print( "ランダムな15個の数字=" , random_15,len(random_15))
  13. get_random5(ランダム15)
  14.  
  15.  
  16. # 15個のランダムな値を走査し、2つの隣接するランダムな数値を取得し、処理用の関数を呼び出します
  17. get_random5(random_15)を定義します。
  18. ランダム_5 = []
  19. # 5回走査し、random_15から5つの異なる要素を取得します
  20. iが範囲(5)内にある場合:
  21. ランダムデータ = np.random.choice(random_15)
  22. random_5.append(ランダムデータ)
  23. random_15.remove(ランダムデータ)
  24. # print( "random_5=" ,random_5)
  25. # print( "random_15=" ,random_15)
  26. random_5numの場合:
  27. ランダム_1 = 数値
  28. ランダム_2 = ランダム_1 + 1
  29. # 印刷(ランダム1、ランダム2)
  30. 最終結果を取得します(ランダム1、ランダム2、ランダム5)
  31.  
  32.  
  33. # 15個のランダムな値のリストに隣接する2つの値が同時に存在するかどうかを判断します。要件を満たしている場合は、リストに保存し、重複排除関数を呼び出します
  34. get_final_result を定義します(ランダム1、ランダム2、ランダム5):
  35. 最終リスト = []
  36. random_1 がrandom_5に含まれ random_2が random_5に含まれる場合:
  37. # 印刷(ランダム5)
  38. final_list.append(ランダム5)
  39. 結果 = quchong(final_list)
  40.      
  41. 結果:
  42. len(result[0]) == 5の場合:
  43. # 印刷(ランダム1、ランダム2)
  44. # print( "結果=" ,結果)
  45. final_result.append(結果)
  46.  
  47.  
  48. # 取得したすべてのリストに対して重複排除処理を実行する
  49. def quchong(リストデータ):
  50. リスト = []
  51. list_data内のiの場合:
  52. もし私 リスト:
  53. リストに追加(i)
  54. 返品リスト
  55.  
  56.  
  57. __name__ == '__main__'の場合:
  58. start_time =時間.時間()
  59. グローバル最終結果
  60. 最終結果 = []
  61. get_random15()
  62.  
  63. 最終結果 = quchong(最終結果)
  64. print( "質問の要件を満たすリストの合計は %d です" % len(final_result))
  65. print( "それらは: %s" % final_result)
  66.  
  67. end_time =時間.時間()
  68. 使用時間 = 終了時間 - 開始時間
  69. 印刷()
  70. print( "このプログラムに使用された時間: {}" .format( time .strftime( '%H(時間):%M(分):%S(秒)' , time .gmtime(used_time))))

このコードを実行すると、質問の要件を満たすリストの具体的な数、リストの具体的な値、および所要時間を確認できます。

テスト後、100,000 サイクル以内に要件を満たすデータが約 1,000 個あり、実行時間はわずか数秒です。ループ強度をさらに拡張すると、プログラムの複雑さが増し、理論上の順列と組み合わせの値に近づきます。時間がかかりすぎるため、ここではこれ以上のテストは行いません。興味がある場合は、デバッグ用にパラメータを変更できます。

結論

私は上級の Python ユーザーです。順列と組み合わせに関するファンの質問に基づいて、この記事では、基本的にファンの要件を満たす、Python の基本 + モンテカルロ アルゴリズムを使用したソリューションを提供します。

しかし、このソリューションにはまだ欠点があります。ループの数が増えると、乱数が大きくなり、順列と組み合わせの数が増え、実行時間が長くなり、当然、取得されるデータの精度も高まります。

<<:  AI インデックス: AI 関連の求人、データ、トレンド

>>:  Facebookが削除した10億の顔情報は、インターネット上の単なる「データゴミ」だ

ブログ    

推薦する

脱ぐ!ドローンは1000億元の農薬市場の発展を加速させている

現在、農業の需要と供給の矛盾がますます顕著になる中、植物保護分野におけるドローンの導入と応用は、農業...

人工知能技術がホームセキュリティ市場の急速な発展を促進

[[240109]]ホームセキュリティ市場はAIを活用してどのように安全を確保しているのか家庭のセキ...

スマートヘルスケアの 6 つの主要な応用分野は何ですか?

スマートヘルスケアで使われる主なAI技術は画像とデータ分析機能ですが、その応用範囲は次の6つを含めて...

量子コンピューティングは今後10年間で物流業界を変えるだろう

近年、サプライチェーンおよび物流業界は、労働力不足から予測不可能な天候、需給の変化まで、ますます多く...

人気の4D Radarオープンソースデータの概要

この記事は、Heart of Autonomous Driving の公開アカウントから許可を得て転...

階乗関連のアルゴリズムとその C++ 実装

階乗とは、必要な数値が得られるまで 1 × 2 × 3 × 4 を掛け合わせることを意味します。 C...

専門家の視点:汎用人工知能の可能性

人工知能分野の発展に関するニュースを追う際の課題の 1 つは、「AI」という用語が、無関係な 2 つ...

人工知能は教育の新たな発展を促進し、これら3つの分野に大きな影響を与えます。

今年の流行語について聞かれたら、「人工知能」という言葉は誰もが知っていると思います。人工知能は多くの...

AI画像合成技術の新たな波:Stable Diffusion 3とSoraアーキテクチャのブレークスルー

人工知能の黄金時代を迎え、画像合成技術はかつてない速さで発展しています。単純な画像編集から複雑なシー...

教育における人工知能の重要性とは何でしょうか?

未来は人工知能のものであるというのは議論の余地のない事実です。10年前に自動運転車や無人自動販売機に...

データサイエンスの現在と未来

データサイエンスは、近年テクノロジー分野で最もホットな分野の 1 つです。データサイエンスまたは関連...

...

...

新時代の人工知能の優位性を獲得し、時代に淘汰されないためにはどうすればよいか

企業で人工知能が応用され、開発されるにつれて、ビジネスリーダーは市場競争力を向上させるためにクラウド...

マイクロソフト、AIを活用してがんの放射線治療時間を短縮:スキャン速度が2.5倍に向上、精度は90%に

6月28日、BBCによると、英国はNHS(国民保健サービス)の全トラストに新しい人工知能技術を原価で...