[code snippet] 위 챗 랜 덤 보너스 알고리즘 구현

class RedEnvelopeError(ValueError):
    """
          
    """


class RedEnvelope:

    def __init__(self, name=None):
        self.name = 'red_envelope:{}'.format(uuid.uuid1().hex) if name is None else name

    def generate(self, total_amount=10000, count=10, min_amount=100, max_amount=20000, shuffle=False, unique=True):
        """
        :param total_amount:      ,    
        :param count:      
        :param min_amount:       ,    ,    100,  100
        :param max_amount:       ,    ,    20000,  20000
        :param shuffle:     
        :param unique:        
        """
        remain_amount = total_amount - count * min_amount
        if count == 0 or max_amount < min_amount or remain_amount < 0:
            raise RedEnvelopeError

        red_envelopes = []
        for remain_count in range(count, 0, -1):
            if remain_count == 1:
                last_amount = min(max_amount, total_amount - sum(red_envelopes))
                red_envelopes.append(last_amount)
                break
            amount = random.random() * (remain_amount * 2 / remain_count)
            if remain_amount <= amount:
                amount = 0
            amount = min(max_amount - min_amount, amount)
            remain_amount -= amount
            amount = int(amount + min_amount)
            red_envelopes.append(amount)

        if shuffle:
            random.shuffle(red_envelopes)


수령 한 보너스 가 0 보다 작 지 않도록 모든 사람 이 최소 min 을 받 을 수 있 도록amount 크기 의 보너스, 그래서 "최저 보장" 을 제외 한 금액 에 만 remainamount 랜 덤 으로.
마지막 보너스 에 대해 서 는 남 은 금액 을 모두 가 져 가 남 는 것 을 막 아야 한다.
실제 분 배 된 금액 amount 는 남 은 금액 remain 보다amount 가 크 면 max 를 초과 할 수 없습니다.amount - min_amount。
참고:
위 챗 보너스 의 랜 덤 알고리즘 은 어떻게 실현 되 었 습 니까?진 펑 씨 의 코드 는 크게 다음 과 같다. 100 위안 이 있다 고 가정 하면 10 명 에 게 나 누 어 준다.그럼 첫 번 째 사람 이 받 은 보너스 크기 는 어떻게 계산 하나 요?100 / 10 = 10 원 입 니 다.기대치 입 니 다.0.01 에서 20 구간 중 (그 중 20 = 10 곱 하기 2) 하 나 를 무 작위 로 뽑 으 면 첫 번 째 사람 이 보 너 스 를 받 는 크기 다.첫 번 째 사람 이 15 원 을 받 았 다 고 가정 하면 나머지 85 원 은 평균 9 명 에 게 나 눠 주 고 이 9 명 은 평균 9.4 원 을 받 았 다. 그러면 두 번 째 사람의 보 너 스 는 0.01 원 에서 18.80 원 구간 에 골 고루 분포 해 순서대로 유추 했다.알고리즘 은 마지막 사람 이 적어도 0.01 원 을 뽑 도록 보장 한다.작성 자: Mr. L 링크:https://www.zhihu.com/question/22625187/answer/85431684 출처: 저작권 은 작가 의 소유 임 을 알 고 있 습 니 다.상업 전 재 는 작가 에 게 연락 하여 권한 을 수 여 받 으 십시오. 비 상업 전 재 는 출처 를 밝 혀 주 십시오.

좋은 웹페이지 즐겨찾기