为了庆祝网站与微信公众号上线一周年,现正式公布周年活动的抽奖代码及流程。此次活动将通过公平透明的方式,从参与的用户中抽出前五名幸运用户。本文将展示具体的代码实现与规则解释,以确保活动的公开性和可信度。
抽奖算法流程
此次抽奖使用了微信昵称 Hash 值转整数的方式进行排名,确保结果随机性和可验证性。具体步骤如下:
- 上证指数参考值:抽奖以 2023 年 6 月 30 日的上证指数收盘价(3202.06)为参考,将小数部分"06"作为中奖参考数字。昵称 Hash 转整数的末两位数越接近该值,排名越靠前。
- 生成用户名单:所有符合条件的参与者信息已在列表中登记。参与用户的微信昵称和参与时间被记录,确保数据的一致性与透明度。
- 昵称 Hash 转换规则:通过 Python 代码将每位用户的微信昵称转为 SHA-1 Hash,再将 Hash 转换为整数,取末两位作为用户抽奖编号。
- 排序规则:根据用户编号与中奖参考数字的距离排序;若两位用户距离相同,则按参与时间优先级决定排名。
代码实现
以下为完整的 Python 代码:
# 新网站周年庆活动抽奖代码
import hashlib
# 6月30日上证指数收盘价作为中奖参考数
sse_index = "3202.06"
lucky_number = int(sse_index.split(".")[1])
print(f"6月30日上证指数:{sse_index},中奖参考数:{lucky_number}")
# 符合条件的用户信息
users = [
{"nickname": "用户昵称", "time": 202306270819}
]
# 抽奖计算
lottery_users = []
for user in users:
nickname = user["nickname"]
time = user["time"]
nickname_hash = hashlib.sha1(nickname.encode("utf-8")).hexdigest()
hash_number = int(nickname_hash, 16)
user_number = hash_number % (10**2)
lottery_users.append({
"nickname": nickname,
"time": time,
"nickname_hash": nickname_hash,
"hash_number": hash_number,
"user_number": user_number
})
lottery_users.sort(key=lambda x: (abs(x["user_number"] - lucky_number), x["time"]))
# 输出排名表
table_header = "| 排名 | 微信昵称 | 昵称Hash转整数最后2位数 | 整数值 | 哈希值 | 参与时间 |\n| --- | --- | --- | --- | --- | --- |"
sorted_table_rows = []
for rank, row in enumerate(lottery_users, start=1):
sorted_table_rows.append(
f"| {rank} | {row['nickname']} | {row['user_number']} | {row['hash_number']} | {row['nickname_hash']} | {row['time']} |"
)
print("\n----------\n\n符合条件用户排名列表:\n")
markdown_table = f"{table_header}\n" + "\n".join(sorted_table_rows)
print(markdown_table)
该代码展示了一个简单的流程,最终输出排名结果。我们提醒用户,若遇到相同昵称的情况,将由人工协助确认。
活动注意事项
- 参与方式:所有注册并符合条件的用户均会被自动记录参与。
- 透明度:为确保公平公正,抽奖过程可通过 Hash 值验证。
- 获奖公布:最终排名前五名的用户将获得周年庆大奖。
常见问题解答(FAQ)
Q1:如何确保活动公平性?
A1:我们使用了不可变的 Hash 值计算和公开的上证指数值作为中奖参考数,确保过程透明。
Q2:什么是中奖参考数?
A2:6 月 30 日上证指数的末两位小数“06”作为中奖参考数,用于确定接近该数字的用户排名。