Pythonのランダムモジュール、重み付きランダムアルゴリズムと実装方法を詳しく解説

高洛峰
リリース: 2017-03-24 17:09:41
オリジナル
2850 人が閲覧しました

random は乱数を生成するために使用され、ランダムに数値を生成したり、文字列を選択したりすることができます。
•random.seed(x) は、乱数generatorのシードを変更します。
通常は特にシードを設定する必要はなく、Pythonが自動的にシードを選択します。
•random.random() ランダムな浮動小数点数 n,0 •random.uniform(a,b) 指定された範囲内のランダムな浮動小数点数を生成するために使用されます。ランダム 整数 a•random.randint(a,b) は、指定された範囲内の整数を生成するために使用されます。a は下限、b は上限、および生成されたランダムな整数a<=n<=b; a=b の場合、n=a; a>b の場合、エラーが報告されます
•random.randrange([start], stop [,step]) [start, stop)、指定された基数に従って増加します セットから乱数を取得します、基数のデフォルト値は 1 です
•random.choice(sequence) シーケンスからランダムな要素を取得します、パラメータのシーケンスは順序付けされたものを表しますtype は特定の型ではなく、一般に list、タプル、文字列などを指します。
•random.shuffle(x[,random]) はリスト内の要素をシャッフルするために使用され、元のリストが変更されます
•random.sample(sequence,k) from the specific シーケンスから k 要素をランダムに取得し、元のシーケンスを変更せずにフラグメントとして返します。 基本的な知識が得られたので、重み付きランダム アルゴリズムを実装しましょう。ランダム アルゴリズムは通常、次のシナリオで使用されます。 セット S があり、たとえば、4 つの項目 A、B、C、D があります。このとき、その中からランダムにアイテムを引きたいのですが、引き出す確率が異なります。たとえば、A が引き出される確率は 50%、B と C が引き出される確率は 20% であるとします。 Dを引く確率は10%です。一般に、各項目に重みを付けることができ、抽出の確率はこの重みに比例します。次に、上記のセットは次のようになります:
{A:5, B:2, C:2, D:1}

方法 1:
最も単純な方法は次のようになります: 重み値に従ってシーケンスを次のように展開します。 lists= [A,A,A,A,A,B,B,C,C,D] の場合、random.choice(lists) はランダムに 1 つを選択します。この選択の時間計算量は O(1) ですが、データ量が多く、スペース消費が大きすぎます。

# coding:utf-8
import random
def weight_choice(list, weight):
  """
  :param list: 待选取序列
  :param weight: list对应的权重序列
  :return:选取的值
  """
  new_list = []
  for i, val in enumerate(list):
    new_list.extend(val * weight[i])
  return random.choice(new_list)
if name == "main":
  print(weight_choice(['A', 'B', 'C', 'D'], [5, 2, 2, 1]))
ログイン後にコピー

方法 2:
より一般的な方法は次のとおりです: 重みの合計を計算し、1 から合計までの数値 R をランダムに選択し、コレクション全体を走査して、次の重みの合計を数えます。走査したアイテムが R 以上の場合、走査を停止し、見つかったアイテムを選択します。
上記のセットを例として使用すると、合計は 10 に等しくなります。乱数が 1 ~ 5 の場合、最初の数値が走査されたときに走査は終了します。選択された確率と一致します。
選択するときはコレクションを走査する必要があり、その時間計算量は O(n) です。

# coding:utf-8
import random
list = ['A', 'B', 'C', 'D']
def weight_choice(weight):
  """
  :param weight: list对应的权重序列
  :return:选取的值在原列表里的索引
  """
  t = random.randint(0, sum(weight) - 1)
  for i, val in enumerate(weight):
    t -= val
    if t < 0:
      return i
if name == "main":
  print(list[weight_choice([5, 2, 2, 1])])
ログイン後にコピー

方法 3:
最初に重みに従って元のシーケンスを並べ替えることができます。このように周回すると、確率の高いアイテムに早く遭遇できるため、周回するアイテムの数が減ります。 (rnd のデクリメントが最も速いため (最初に最大の数値を減算する)) {A:5, B:2, C:2, D:1} と {B:2, C:2, A:5, D:1 を比較します}
前者が通過するステップ数の期待値は 5/10*1+2/10*2+2/10*3+1/10*4=19/10 であるのに対し、後者の期待値は 2/ 10*1+2/ 10*2+5/10*3+1/10*4=25/10。
これにより、平均選択速度が向上しますが、元のシーケンスの並べ替えにも時間がかかります。
最初にプレフィックスと重み値のシーケンスを作成し、次に乱数 t を生成した後、二分法を使用してこのプレフィックスとシーケンスから乱数を見つけることができます。そうすると、選択の時間計算量は O(logn) になります。
りー

以上がPythonのランダムモジュール、重み付きランダムアルゴリズムと実装方法を詳しく解説の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

関連ラベル:
ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート
私たちについて 免責事項 Sitemap
PHP中国語ウェブサイト:福祉オンライン PHP トレーニング,PHP 学習者の迅速な成長を支援します!