引言

红包分配算法概述

1. 普通随机法

import random

def ordinary_random(total_amount, num_people):
    amounts = []
    remaining_amount = total_amount
    for _ in range(num_people):
        if remaining_amount <= 0:
            break
        amount = random.uniform(0.01, remaining_amount)
        amounts.append(amount)
        remaining_amount -= amount
    return amounts

2. Shuffle技术

import random

def shuffle_total(total_amount, num_people):
    amounts = [random.uniform(0.01, total_amount / num_people) for _ in range(num_people)]
    random.shuffle(amounts)
    return amounts

3. 二倍均值算法

二倍均值算法通过设置每个人红包的最小值,并使用剩余金额的两倍均值为随机区间,实现更正态的分配。这种方法可以根据需求调整倍数,以实现更扁平的正态分布。

def double_mean(total_amount, num_people, min_amount=0.01):
    average = total_amount / num_people
    min_mean = min_amount * 2
    max_mean = average * 2
    amounts = [random.uniform(min_mean, max_mean) for _ in range(num_people)]
    return amounts

4. 线段分割算法

线段分割算法将红包总额视为一条线段,在线段上随机选择若干点进行分割,从而将红包随机分成多份。这种方法在逻辑上更加合理,但实现过程相对复杂。

def segment_total(total_amount, num_people):
    segment_length = total_amount / num_people
    segments = [random.uniform(0, segment_length) for _ in range(num_people)]
    amounts = [segments[i] - (segments[i - 1] if i > 0 else 0) for i in range(num_people)]
    return amounts

结论