[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 출처: 저작권 은 작가 의 소유 임 을 알 고 있 습 니 다.상업 전 재 는 작가 에 게 연락 하여 권한 을 수 여 받 으 십시오. 비 상업 전 재 는 출처 를 밝 혀 주 십시오.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
다양한 언어의 JSONJSON은 Javascript 표기법을 사용하여 데이터 구조를 레이아웃하는 데이터 형식입니다. 그러나 Javascript가 코드에서 이러한 구조를 나타낼 수 있는 유일한 언어는 아닙니다. 저는 일반적으로 '객체'{}...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.