1

確率アルゴリズムの問​​題があります

目標は、3 つの項目を含むリストを取得することです。FinalListとして

4 つのソース リストがあります。

ALIST、BLIST、CLIST、DLIST

すべて不明な長さがあります。ユニークな要素が含まれています

(実際には、プログラムの最初はすべて空で、redis のソート済みリストから取得します。実行すると、そこに成長します)

このソース リストから項目を選択します。ランダムなアイテムをピックアップして FinalList を生成する

次の要件を確認してください

FinalListでは、

  • ALISTのアイテム出現確率は43%
  • BLISTのアイテム出現確率は37%
  • CLISTのアイテムが出現する確率は19%
  • DLISTのアイテムが出現する確率は1%

私はいくつかのコードを書きましたが、これは 4 つのリストのためだけに多くの要素があります。

from random import choice

final_list = []
slot = []

a_picked_times = 0

while a_picked_times < 43:
    item = choice(ALIST)
    ALIST.remove(item)

    if item in already_picked_list:
        continue

    slot.append(item)
    a_picked_times += 1


b_picked_times = 0

while b_picked_times < 37:
    ...

SOME CODE SIMILAR

# now slot is a list which contains 100 elements, 
# in slot, there are 43 elements of ALIST'items, 37 of B, 19 of C, 1 of D

for i in range(3):
    final_list.append( choice(slot) )

したがって、これにより確率要件を確保できます。 ただし、次の条件の下でのみ: この 4 つのリストには多くの要素があります。

list.remove( item ) はリスト内のすべての要素を削除するわけではないため、必要な時間でピックアップ項目を修正します。

A, B, C, D が空の場合、または要素が十分でない場合、確率要件をどのように確保できますか?

A、B、C、D リストはすべて redis ソート済みリストから取得されます。または redis を使用した解決策はありますか?

4

3 に答える 3

2

(要素ごとに) 1 から 100 までの数字を選択し、それに基づいてソース リストを選択する方が理にかなっている場合があります。

于 2012-08-25T16:24:27.473 に答える
1

私が理解しているように、あなたはランダムなサイズのリストを生成しているので、与えられた確率で3つを選択したいと思います。私の理解が正しければ、[0,1]に。を使用して均一な変量を生成する必要がありますrandom.uniform(0., 1.)

次に、0..1間隔を適切な長さに分割します。

import random

for i in range(3):
    r = random.uniform(0., 1.)
    if r < .43:
        final_list.append(random.choice(ALIST))
    elif r < .43 + .37:
        final_list.append(random.choice(BLIST))
    elif r < .43 + .37 + .19:
        final_list.append(random.choice(CLIST))
    else:
        final_list.append(random.choice(DLIST))

インデックスを選択するだけなので、リストからの選択は簡単です。

これはOfirの答えと同等ですが、あなたにもっとアピールする場合としない場合があることに注意してください。

于 2012-08-25T16:36:04.350 に答える
0

したがって、私が収集できることから、コードは正確に 43 個の ALIST 要素、37 個の BLIST 要素などを削除しています。

より良い解決策は、与えられた確率を使用して final_list を作成することです。これは、他のリストが空の場合にも考慮されます。

ALIST_PROB = 0.43
BLIST_PROB = ALIST_PROB + 0.37
CLIST_PROB = BLIST_PROB + 0.19
DLIST_PROB = CLIST_PROV + 0.01

while len(final_list) < 3:

    #generate a random number
    rand = random.random()        

    if rand <= ALIST_PROB:
        element = getEl(ALIST)
    elif rand <= BLIST_PROB:
        element = getEl(BLIST)
    elif rand <= CLIST_PROB:
        element = getEl(CLIST)
    elif rand <= DLIST_PROB:
        element = getEl(DLIST)

    if not element == None:
        final_list.append(element)

def getEl(list):
    try:
        element = random.choice(list)
    except IndexError:
        element = None
    return element
于 2012-08-25T16:41:16.350 に答える