简 介: 本文探讨了全国总决赛预赛队伍抽签顺序的随机投票方案设计。主办方通过提供三个计算机生成的随机版本让参赛队伍投票,选择居中的方案作为最终结果。文章指出这种投票可能存在拉票风险,并提出了防范措施:将三个投票数字串联后平方,再将结果数字累加取模3,使投票数据与最终方案形成复杂映射关系,从而有效防止人为操控。这种设计通过建立难以预测的数学转换机制,确保了抽签过程的公平性和随机性。
关键词
: 投票,拉票,哈希函数
如何避免拉票?
01 投票随机
一、投票抽签
今天,在公众号公开了全国总决赛预赛队伍抽签顺序产生的方法。 通过给出三个计算机生成的随机版本, 让参赛队伍进行投票选择。 规定了投票截止时间为半夜12点。 解释根据投票方案票数, 选择其中居中的方案最为最终的比赛抽签方案。 那么问题来了, 这种投票过程, 是否可能存在着参赛队伍拉票的可能性。 反正, 今天我看投票的结果, 起起伏伏, 变化了很多次。 似乎蕴含着背后, 着5000多张投票背后的汹涌波浪。
二、避免拉票
那么问题来了。 如何根据投票数字, 产生一个随机数字, 这个数字不太容易被别人利用进行拉票? 一种方案是这样的, 将三个投票数字, 串联成一个长征数字, 计算它的平方。 然后将结果所有的数字累加起来, 得到一个转换后的数字, 将这个 数字去3 的余数, 变可以由这个余数确定第几个方案。 使用这种方法, 使得投票数字与选择方案之间具有很复杂的对应关系, 也因此很难被人利用和空随车了。
※ 总 结 ※
本文讨论了如何设计一个复杂的哈希映射过程, 将投票数据映射到最终的选择方案。 从而避免了拉票对于最终选择结果的影响。
03 想当然中的错误
上面的影响关系,存在着理论上的缺陷。 很快同学们就指出了其中的问题:
▲ 图3.1 得到的结果对于1,2,3 不是对等的
下面是同学们给出的计算机仿真的结果:
▲ 图3.2 计算机仿真结果
如果将平方修改为三次方, 结果就可以了。
#!/usr/local/bin/python
# -*- coding: gbk -*-
#============================================================
# TEST1.PY -- by Dr. ZhuoQing 2025-08-11
#
# Note:
#============================================================
from headm import *
result_count = {0:0, 1:0, 2:0}
start = 18281760100
end = start + 100000
for N in range(start, end+1):
square = N**3
sum_digits = sum([int(ss) for ss in str(square)])
remainder = sum_digits%3
result_count[remainder] += 1
total_numbers = end-start+1
percentages = {r:(count/total_numbers)*100 for r,count in result_count.items()}
for r,percent in percentages.items():
printf(f"Percentages of plan {r+1}: {percent:.2f}%%")
#------------------------------------------------------------
# END OF FILE : TEST1.PY
#============================================================
仿真结果:
Percentages of plan 1: 33.33%%
Percentages of plan 2: 33.33%%
Percentages of plan 3: 33.33%%
仿真实验也很容易验证, 但凡平方为奇数的情况, 三种方案都是均衡的。
如果将 前面的数据与方案之间的关系绘制出来, 可以看到对应关系之间并非是一个随机关系, 而是随着组合的数字之间是周期关系。 所以,这种影响看似复杂, 但实际上是相当的简单。
▲ 图3.3 组合数字与结果之间的关系
1、修改成平方
如果将前面的计算修改成计算数字的 平方根, 那么结果可能会变现为更加随机的情况。
使用 mpmath 软件包中的高精度数学计算, 通过 mp.dps 设置小数点的位数。 然后同样计算出所有结果中的数字之后然后再取3的余数。
#!/usr/local/bin/python
# -*- coding: gbk -*-
#============================================================
# TEST1.PY -- by Dr. ZhuoQing 2025-08-11
#
# Note:
#============================================================
from headm import *
from mpmath import mp
mp.dps = 50
result_count = {0:0, 1:0, 2:0}
start = 18281760100
end = start + 300
plandim = []
for N in range(start, end+1):
square = mp.sqrt(N)
printf(str(square))
sum_digits = sum([int(ss) for ss in str(square) if ss !='.'])
remainder = sum_digits%3
result_count[remainder] += 1
plandim.append(remainder)
total_numbers = end-start+1
percentages = {r:(count/total_numbers)*100 for r,count in result_count.items()}
for r,percent in percentages.items():
printf(f"Percentages of plan {r+1}: {percent:.2f}%")
#------------------------------------------------------------
plt.plot(range(start, end+1), plandim, lw=3)
plt.xlabel("Number", color="steelblue", fontsize=16)
plt.ylabel("Plan", color="steelblue", fontsize=16)
plt.grid(True)
plt.tight_layout()
plt.show()
#------------------------------------------------------------
# END OF FILE : TEST1.PY
#============================================================
下面是得到的一些平方根的结果。
135210.06022482202858816516855884186304384601461059
135210.06022851997827594566383877546487513303761631
135210.06023221792796362502143805224368688511847853
135210.0602359158776512032413566804977237878586399
135210.06023961382733868032359466852523052572477205
135210.06024331177702605626815202462445178204877562
135210.0602470097267133310750287570936322390277802
135210.06025070767640050474422487423101657772414442
135210.06025440562608757727574038433484947806545586
135210.06025810357577454866957529570337561884453112
135210.06026180152546141892572961663483967771941576
135210.06026549947514818804420335542748633121338435
135210.06026919742483485602499652037956025471494046
135210.06027289537452142286810911978930612247781662
135210.06027659332420788857354116195496860762097439
计算出300个数字对应的方案的比例如下, 可以看到三个方案中的比例并不精确的平衡。 方案2所占的比例偏多。 方案3所占的比例偏少。
Percentages of plan 1: 32.23%%
Percentages of plan 2: 37.21%%
Percentages of plan 3: 30.56%%
▲ 图3.4 递增的数字与方案选择之间的关系
如果统计10000个连续数字方案的比例, 现在可以看到就比较均衡了。
Percentages of plan 1: 33.84%%
Percentages of plan 2: 33.56%%
Percentages of plan 3: 32.61%%
如果将小数点取 500个, 效果可能会更好一些。
▲ 图3.5 mpmath的小数点的精度提高到500 对应的数字与方案之间的关系
▲ 图3.6 2000个数字对应的方案统计
● 相关图表链接: