欢迎讨论,一起完善这个 随机抽奖 方式。
随机抽奖 规则
- 组织者确定
- 参与方式
- 奖品(内容和数量)
- 提交截止时间
- 随机现象观察时间
- 映射运算规则
- 奖品分发联系方式(邮件、站内信等)
流程:
- 在截止时间前,参与者提交一个“名称”和联系方式(可将联系方式作为名称)
- 在随机现象观察时间前,组织者根据提交顺序,将名称和自然数绑定,并公示 “自然数 – 名称” 的列表,以供参与者检查
- 观察随机现象,得到数据
- 将数据通过运算映射到自然数
- ?!公布结果,发奖品
随机现象
选取原则:
- 首先要有很高的随机度,难以被人干预(或者被潜在参与者干预)
- 容易被观察,观察结果确定无疑,最好是生活中容易接触到的
- 最好每隔一天就能有新的观察结果,周期久则不利于有期限的奖品
举例:
- 一枚比特币的美元价格。某天北京时间上午 12 点整的美元价格。操作方式:在币安交易所以 1 小时计,查看 12 点的“开”的价格。
- 汇率
计算方式
将随机现象的结果用字符串表示,使用 Python 内置的 hashlib
库创建一个 SHA-256 哈希值。然后取模映射到一定范围的自然数(从 1 开始)。
hashlib
提供的哈希函数会对输入数据的任何微小变化都产生截然不同的哈希值,对于同一个数据的哈希是确定的。以比特币价格为例,高位数字是可预测的,这种特性能避免这种可预测性可能造成的某种趋势,使得最终映射到自然数的值是均匀且随机的。
Python 代码如下,修改那三个变量的值,运行得到结果:
import hashlib
# 假设比特币的价格是41289.03
random_data = 41289.03 # 观察得到的随机数据
participator_amount = 100 # 参与者数量
prize_amount = 3 # 奖品数量
def map_btc_price_to_range(a_string: str, participator_amount: int, prize_amount: int):
mapped_values = []
last = ''
for i in range(1, prize_amount + 1):
a_string += last
# 使用hashlib生成一个SHA-256 hash
hash_object = hashlib.sha256(a_string.encode())
hex_dig = hash_object.hexdigest()
# 将生成的十六进制hash转换为整数
hash_int = int(hex_dig, 16)
# 使用取余运算将整数映射
mapped_value = (hash_int % participator_amount) + 1
mapped_values.append((i, mapped_value))
last = str(mapped_value)
return mapped_values
mapped_values = map_btc_price_to_range(str(random_data), participator_amount, prize_amount)
for i, number in mapped_values:
print(f"{i}: {number}")
防止单人多次参与
关联其他平台,微信等
原文链接: https://blog.vfly2.com/2024/01/fair-and-transparent-random-drawing-method/
版权声明:本博客所有文章除特別声明外,均为 AhFei 原创,采用 CC BY-NC-SA 4.0 许可协议。转载请注明来源 承飞之咎 (blog.vfly2.com) 。
没有真正的随机,所有的随机都是运算的结果。
随机现象不需要严格随机,只要相对于参与者随机即可,比特币的价格足够随机并且容易观察