使用哈希映射实现的抽奖方法,dist里面有Windows下的预编译程序,可以直接使用。
peng-zhihui / bilibililottery Goto Github PK
View Code? Open in Web Editor NEWZHIHUI抽奖算法
ZHIHUI抽奖算法
感觉内容很多,光是开源代码也不一定学得会,Up打算啥时候整个教程什么的?
现在想想,别说画板,设计电路,以及后面的系统搭建和nlp;
光是最简单的焊电路我都没信心能焊好,但还是有很多朋友想和我一起跟进这个项目把它复现一遍,感觉能学到不少东西。
先获得一个和动态唯一相关的id号,即Dynamic_id
然后调用GetUsers函数,将该动态下所有作为一级评论员的用户信息抓取下来
其中调用了GetTotalRepost函数,对用户的数量先做一个初步规模获取,即得到count的数量
又调用了GetMiddleStr函数,相当于一个定位函数,配合着在条件允许范围内的commentindex找到对应位置用户所发的信息
然后对json包进行解包工作,摘出各项子信息
然后常规地将用户信息塞入list返回
utils中封装了二分搜索,可能是预先为了按照某种条件来筛选获奖用户
但是最后直接计算幸运值并排序可能是更直接与方便的选择便被弃用了
ZHIHUI 这个算法的思路实在是太有趣了,但在分析后我有一些疑虑
当然由于 2 的 256 次方是一个巨大的数字,有很大概率是会出现没有任何一个用户的奖券号码跟开奖号码是一致的,所以我会在所有的参与抽奖用户里面,选取彩票券与这个数字最接近的一个用户,作为获奖者送出奖品
已求出用户 A (35040733) 和 B (20259914) 的 UID Hash 分别为
787ccebcc8a084b1df6994047be31706ebebb520ba0ce53dc44ec49c24eadcbb
4b3ec795e99f163d022978866fb89110b9e74c1d1aa5932f074e441d115d4cda
再把 Hash 的 16 进制编码转换为 10 进制分别为
54498057715370390290478912473173450895822179519350824269452220845244860259515
34034385650919512184593039349216595979306765265358617344517855224905181514970
将 16 进制转换为 10 进制的代码是这样的
int('787ccebcc8a084b1df6994047be31706ebebb520ba0ce53dc44ec49c24eadcbb', 16)
int('4b3ec795e99f163d022978866fb89110b9e74c1d1aa5932f074e441d115d4cda', 16)
SHA 256 的范围为从 [0, ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff]
,总共有 115792089237316195423570985008687907853269984665640564039457584007913129639935
种可能性,从中求用户 A 和 B 的差值的一半 abs(a - b) / 2
结果为
10231836032225439052942936561978427458257707126996103462467182810169839372273
通过以上结果对 A 和 B 分别进行加减后的中奖范围如下
[44266221683144951237535975911195023437564472392354720806985038035075020887242, 115792089237316195423570985008687907853269984665640564039457584007913129639935]
[0, 44266221683144951237535975911195023437564472392354720806985038035075020887243]
用户 A 的中奖结果有 71525867554171244186035009097492884415705512273285843232472545972838108752693
种,而用户 B 的中奖结果有 44266221683144951237535975911195023437564472392354720806985038035075020887243
种。通过比较 A 和 B 的中奖范围可以发现 A 比 B 中奖的结果多出 27259645871026292948499033186297860978141039880931122425487507937763087865450
种
递归或许能够解决,就像 Bogosort 也有可能是一万年
🐶 🐶 🐶
A declarative, efficient, and flexible JavaScript library for building user interfaces.
🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
An Open Source Machine Learning Framework for Everyone
The Web framework for perfectionists with deadlines.
A PHP framework for web artisans
Bring data to life with SVG, Canvas and HTML. 📊📈🎉
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
Some thing interesting about web. New door for the world.
A server is a program made to process requests and deliver data to clients.
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
Some thing interesting about visualization, use data art
Some thing interesting about game, make everyone happy.
We are working to build community through open source technology. NB: members must have two-factor auth.
Open source projects and samples from Microsoft.
Google ❤️ Open Source for everyone.
Alibaba Open Source for everyone
Data-Driven Documents codes.
China tencent open source team.