如何通过投票产生一个随机数字? 避免拉票

简 介: 本文探讨了全国总决赛预赛队伍抽签顺序的随机投票方案设计。主办方通过提供三个计算机生成的随机版本让参赛队伍投票,选择居中的方案作为最终结果。文章指出这种投票可能存在拉票风险,并提出了防范措施:将三个投票数字串联后平方,再将结果数字累加取模3,使投票数据与最终方案形成复杂映射关系,从而有效防止人为操控。这种设计通过建立难以预测的数学转换机制,确保了抽签过程的公平性和随机性。

关键词 投票拉票哈希函数

如何避免拉票?

 

01 票随机


一、投票抽签

  今天,在公众号公开了全国总决赛预赛队伍抽签顺序产生的方法。  通过给出三个计算机生成的随机版本,  让参赛队伍进行投票选择。  规定了投票截止时间为半夜12点。 解释根据投票方案票数, 选择其中居中的方案最为最终的比赛抽签方案。  那么问题来了, 这种投票过程, 是否可能存在着参赛队伍拉票的可能性。 反正, 今天我看投票的结果, 起起伏伏, 变化了很多次。  似乎蕴含着背后, 着5000多张投票背后的汹涌波浪。

G6M1754812850_1920_1080.MP4|_-6

二、避免拉票

  那么问题来了。  如何根据投票数字,  产生一个随机数字, 这个数字不太容易被别人利用进行拉票? 一种方案是这样的, 将三个投票数字,   串联成一个长征数字,  计算它的平方。  然后将结果所有的数字累加起来,  得到一个转换后的数字,  将这个 数字去3 的余数,  变可以由这个余数确定第几个方案。  使用这种方法, 使得投票数字与选择方案之间具有很复杂的对应关系, 也因此很难被人利用和空随车了。

G12M1754813862_1920_1080.MP4|_-12

 

  结 ※


  文讨论了如何设计一个复杂的哈希映射过程, 将投票数据映射到最终的选择方案。   从而避免了拉票对于最终选择结果的影响。

G2M1754813976_1920_1080.MP4|_-2

 

03 当然中的错误


  面的影响关系,存在着理论上的缺陷。 很快同学们就指出了其中的问题:

▲ 图3.1 得到的结果对于1,2,3 不是对等的

▲ 图3.1 得到的结果对于1,2,3 不是对等的

  下面是同学们给出的计算机仿真的结果:

▲ 图3.2 计算机仿真结果

▲ 图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 组合数字与结果之间的关系

▲ 图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 递增的数字与方案选择之间的关系

▲ 图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.5 mpmath的小数点的精度提高到500 对应的数字与方案之间的关系

▲ 图3.6 2000个数字对应的方案统计

▲ 图3.6 2000个数字对应的方案统计


● 相关图表链接:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

卓晴

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值