建模初衷

旧词已去,新春将至,首先祝各位新春快乐,龙年大吉!

​ 最近,我不禁留意到许多朋友在抢红包这一传统活动中屡次受挫,心生疑惑与好奇。在这个新年风俗的背后,究竟隐藏着怎样的数学模型和本源机制呢?于是,我产生了一个突发奇想的想法,希望通过构建一个专注于抢红包的数学模型,深入探讨这一活动的规律、趋势以及可能的变数。

​ 这个数学模型的目标不仅仅是揭示红包金额的分配方式,更是希望通过对抢红包过程的数学建模,挖掘其中的概率学、随机性、和博弈理论等数学原理。通过精心设计模型,我们或许能够理解为何有些人总能赢得更多,而有些人却屡屡受挫的原因。这也为我们提供了一个新的视角,来看待这个看似简单却又蕴含深厚数学内涵的传统文化现象。

模型雏形

​ 在红包数据庞大的情况下,抢红包的机制可以近似看作是随机抽样。我们可以采用蒙特卡洛模拟方法,通过生成大量的随机样本进行统计分析,从而估算红包分配的平均情况。这种方法通过模拟多次独立的红包抢夺过程,得到了一个近似的红包金额分布,

​ 这种方法的优势在于,它不仅能够在庞大的数据集上进行模拟,而且还能够灵活地应用于不同的分布类型。我们引入了参数 distribution,使得模拟可以选择均匀分布或正态分布等。此外,为了提高效率,我们使用了 NumPy 库生成正态分布,使模拟更加高效。

这个模型的局限性在于它仍然是一个概率模型,通过模拟得到的结果是一种期望的近似。在实际应用中,还可以进一步考虑更复杂的因素,例如用户心理、群体行为等,以得到更准确的模拟结果。这个模型的主要目的是为了提供一个直观的近似方法,用于初步理解红包分配的规律。

模型验证

生成的图像是红包金额分配的模拟结果。在这个模型中,我们进行了多次蒙特卡洛模拟,每次模拟都对同一组人数和总金额进行了10000次红包抽取。图像中的 x 轴表示抢红包的人数,y 轴表示每个人抢到的红包平均金额。

通过这个图像,我们可以观察到在给定的总金额和人数下,每个人抢到的红包平均金额的分布情况。在模拟的多次试验中,我们得到了多个平均分布曲线,每条曲线代表一次模拟的结果。这样的可视化展示使我们能够更清晰地了解红包分配的随机性和不确定性。

在图像中,如果某个人数下的平均金额分布较为集中,说明在这种情况下,大多数人抢到的金额差异不大。相反,如果分布较为分散,说明抢到的金额存在较大的差异。

Figure_1

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
import random
import matplotlib.pyplot as plt
import numpy as np

def simulate_red_packet(total_amount, total_people, num_simulations, distribution='uniform'):
all_results = []

for _ in range(num_simulations):
results = []

for _ in range(10000): # 模拟10000次抢红包
remaining_amount = total_amount
remaining_people = total_people
red_packet = []

for _ in range(total_people - 1):
# 随机生成一个红包金额
if distribution == 'uniform':
amount = random.uniform(0.01, remaining_amount - remaining_people * 0.01)
elif distribution == 'normal':
amount = max(0.01, np.random.normal(remaining_amount / remaining_people, 1))
else:
raise ValueError("Invalid distribution type")

red_packet.append(amount)
remaining_amount -= amount
remaining_people -= 1

# 最后一个红包的金额等于剩余的金额
red_packet.append(remaining_amount)

# 随机打乱红包顺序
random.shuffle(red_packet)

# 记录每个人抢到的金额
results.append(red_packet)

all_results.append(results)

return all_results

def analyze_results(all_results):
average_amounts_list = []

for results in all_results:
average_amounts = []

for i in range(len(results[0])):
total_amount = sum(result[i] for result in results)
average_amount = total_amount / len(results)
average_amounts.append(average_amount)

average_amounts_list.append(average_amounts)

return average_amounts_list

def plot_distribution(average_amounts_list, num_simulations):
for i in range(num_simulations):
plt.plot(range(1, len(average_amounts_list[i]) + 1), average_amounts_list[i], label=f'Simulation {i + 1}')

plt.xlabel('Person')
plt.ylabel('Average Amount')
plt.title('Red Packet Distribution with Varying Data Amount')
plt.legend()
plt.show()

def main():
total_amount = 100 # 总金额
total_people = 10 # 总人数
num_simulations = 5 # 模拟次数

# 模拟均匀分布下的抢红包情况
all_results_uniform = simulate_red_packet(total_amount, total_people, num_simulations, distribution='uniform')
average_amounts_uniform = analyze_results(all_results_uniform)
plot_distribution(average_amounts_uniform, num_simulations)

# 模拟正态分布下的抢红包情况
all_results_normal = simulate_red_packet(total_amount, total_people, num_simulations, distribution='normal')
average_amounts_normal = analyze_results(all_results_normal)
plot_distribution(average_amounts_normal, num_simulations)

if __name__ == "__main__":
main()

模型优化

我们可以建立一个简单的数学模型,其中包含三个变量:引诱红包的金额量(enticing_amount)、引诱的群聊数量(group_count)、和最终净红包的回报率(return_rate)。我们可以假设这些变量之间存在某种线性关系。

Net_Red_Packet=enticing_amount×group_count×return_rate+noise

其中,noise 表示模型中的随机噪声,可以包含一些不可预测的因素。

为了使用神经网络构建模型,我们可以将其视为一个回归问题。我们的输入特征为引诱红包的金额量、引诱的群聊数量,输出为最终净红包的回报率。

Figure_2

可以看到在epoch接近100时,尽管有一点波动,在之后训练损失值已经趋于稳定。

Figure_3

在以上可视化图像中不难发现,红包金额有以下几个特点:

  1. 随机性主导分配: 由于红包的随机性,抢到红包的金额呈现出随机分布的特征。这符合我们对红包抢够的直观认知,即每个人抢到的金额具有不确定性。
  2. 平均金额趋向: 随着模拟次数的增加,我们观察到平均金额有向某个数值趋近的趋势。这可能是由于模型中设置的金额范围和总人数等参数导致的。在实际情况中,红包金额的平均分配可能受到更多因素的影响,例如红包金额设置、群聊人数等。
  3. 模型的应用范围: 这个模型在一定程度上反映了红包随机分配的特性,但并不涵盖所有情况。实际中,红包分配还可能受到人为干预、算法调整等因素的影响,这些因素并未在模型中考虑。

模型总结

  1. 更复杂的模型: 在实际应用中,可以考虑引入更多的因素,如用户关系、历史抢红包记录等,构建更为复杂的数学模型,以更准确地描述红包分配的机制。

  2. 算法优化: 针对特定场景,可以优化红包分配的算法,以达到更好的用户体验。这可能需要对模型进行细致的参数调整和算法改进。

  3. 社会学和心理学因素: 考虑到红包活动是一种社交行为,未来的研究可以引入社会学和心理学的因素,深入探讨红包背后的社交动机和心理机制。

    以及,可以适当考虑人品问题。

    (本文章无任何研究意义,仅供娱乐,相关可视化代码已经发布到Github上)