을 여기에 내 걸릴 수 있습니다 : 유사성 유사성이 0.4
점수했다 0.3
과 항목 2 득점 한 해당 항목 1을 가정 해 봅시다. 그런 다음이 두 항목 중 하나를 선택할 때 항목 1은 항목 2보다 먼저 확률이 0.3/(0.3 + 0.4)
이어야합니다. 이 방법으로 높은 점수를받은 항목은 이며 일반적으로입니다. 테스트를 위해
import random
def pick(a,b,key = None):
ka = key(a) if key else a
kb = key(b) if key else b
if ka+kb == 0:
return random.int(0,1)
else:
p = ka/(ka+kb)
return 0 if random.random() <= p else 1
def randMerge(xs,ys,key = None):
merged = []
i = j = 0
while i < len(xs) and j < len(ys):
k = pick(xs[i],ys[j],key)
if k == 0:
merged.append(xs[i])
i += 1
else:
merged.append(ys[j])
j += 1
if i == len(xs):
merged.extend(ys[j:])
else:
merged.extend(xs[i:])
return merged
def randSort(items,key = None):
if len(items) < 2:
return items
else:
n = len(items)//2
xs = items[:n]
ys = items[n:]
return randMerge(randSort(xs,key),randSort(ys,key),key)
: 예를 들어
i = [
{'id': '1', 'P': 0.5},
{'id': '2', 'P': 0.4},
{'id': '3', 'P': 0.8},
{'id': '4', 'P': 0.9}
]
: 다음과 같은 기능이 아이디어를 통합 병합-종류의 변형 구현 P의 범위는 무엇
>>> for j in range(5): print(randSort(i,key = lambda x: x['P']))
[{'P': 0.5, 'id': '1'}, {'P': 0.9, 'id': '4'}, {'P': 0.8, 'id': '3'}, {'P': 0.4, 'id': '2'}]
[{'P': 0.8, 'id': '3'}, {'P': 0.5, 'id': '1'}, {'P': 0.9, 'id': '4'}, {'P': 0.4, 'id': '2'}]
[{'P': 0.9, 'id': '4'}, {'P': 0.5, 'id': '1'}, {'P': 0.8, 'id': '3'}, {'P': 0.4, 'id': '2'}]
[{'P': 0.5, 'id': '1'}, {'P': 0.8, 'id': '3'}, {'P': 0.9, 'id': '4'}, {'P': 0.4, 'id': '2'}]
[{'P': 0.8, 'id': '3'}, {'P': 0.4, 'id': '2'}, {'P': 0.9, 'id': '4'}, {'P': 0.5, 'id': '1'}]
(분 및 최대 값)? – ayhan
무작위 인 경우 실제로는 그런 종류가 아닙니다! – jonrsharpe
'i.sort (key = lambda x : random.random()/x [ 'P'])'당신이 원하는 것을 하시겠습니까? 작은'P' 값으로 넓은 범위의 무작위 키를 제공하므로 대개'P'가 큰 값보다 나중에 목록에 나타납니다. 그러나 임의의 값은 항상'random.random()'의 아주 작은 결과로 운이 좋게 될 수 있으며리스트의 맨 앞에 나타납니다. – Blckknght