>

정수 값 k 가 있습니다  그리고 1에 해당하는 확률 목록입니다. k 를 구분하는 새 목록을 만들고 싶습니다.  내 목록의 확률에 따라 더 작은 정수로.

문제는 사전에 내 목록의 크기를 알지 못하고 내 목록의 여러 확률이 작고 같을 수 있으므로 새 목록이 항상 k 에 합산되는 것은 아닙니다 .

예 :

> k = 10
> l = [0.12, 0.12, 0.04, 0.04, 0.02, 0.02, 0.03, 0.03, 0.02, 0.02, 0.27, 0.27]
> sum(l)
1.0
> new_l = [int(round(k*v)) for v in a]
> print(new_l)
[1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 3, 3]
> sum(new_l)
8

sum(new_l) == k 를 어떻게 시행 할 수 있습니까 ?

적어도 내 방법으로는 가능하지 않을 수도 있습니다. k 경우에도   len(l) 보다 큽니다 k 인 경우  이상하게 작동하지 않는 것 같습니다.

>>> for k in [10, 11, 12, 13, 14, 15, 16, 20, 50, 75, 101, 1001, 1002, 10001, 10002, 100001, 100002]:
...     print(k, sum([round(k*v,0) for v in a]))
... 
(10, 8.0)
(11, 8.0)
(12, 8.0)
(13, 14.0)
(14, 14.0)
(15, 14.0)
(16, 14.0)
(20, 18.0)
(50, 52.0)
(75, 76.0)
(101, 100.0)
(1001, 1000.0)
(1002, 1002.0)
(10001, 10000.0)
(10002, 10002.0)
(100001, 100000.0)
(100002, 100002.0)


  • 답변 # 1

    어떻게 :

    k = 10
    l = [0.12, 0.12, 0.04, 0.04, 0.02, 0.02, 0.03, 0.03, 0.02, 0.02, 0.27, 0.27]
    targets = [k*v for v in l]
    new_l = [ int(v) for v in targets]
    while sum(new_l) < k:
        residuals = [ t - v for t,v in zip(targets, new_l) ]
        index = residuals.index( max(residuals) )
        new_l[index] += 1
    
    

    이것은 가장 큰 정수 n 를 찾는 것으로 시작합니다  그런 n   k*v 보다 작습니다 그런 다음 sum(new_l) == k 까지 최악의 n을 증가시켜 고정시킵니다. . 완료하는 데 O (len (l)) 이상의 작업이 필요하지 않습니다.

  • 답변 # 2

    잘못 진행하고 있습니다. 당신이하려는 것은 당신의 목록에서 옵션을 선택하는 것입니다 n  타임스. 이것은 numpy.random.choice 를 사용하여 달성 할 수 있습니다  기능.

    해당 코드는 다음과 같습니다.

    from numpy.random import choice
    from collections import Counter
    draw = choice(range(12), 100,
                  p=[0.12, 0.12, 0.04, 0.04, 0.02, 0.02, 0.03, 0.03, 0.02, 0.02, 0.27, 0.27])
    counter = Counter(draw)
    print(counter.values())
    print(sum(counter.values()))
    
    

    이것이 출력됩니다 :

    dict_values([16, 13, 7, 3, 1, 1, 2, 2, 3, 2, 31, 19])
    100
    
    

  • 답변 # 3

    랜덤 화를 통해이를 수행 할 수 있습니다 :

    sl = np.cumsum(l) # cumulative probability
    b = np.random.rand(10) # a random number for each of your integers
    new_l = np.zeros(l.shape)    
    for i in range(k):
        iinsert = np.where(b[i]>sl)[0][0] # first entry where b is larger than the cumumlative prob
        new_l[iinsert] += 1
    
    

  • 이전 ruby - 자동 판매 대금의 원래 청구 및 환불 ID를 얻는 방법
  • 다음 python - 잘못된 값을 반환하는 재귀 함수가 있습니다 이것이 왜 가능하고 어떻게 해결할 수 있습니까?