• 抽奖活动中的学习


    《神秘的程序员们》年度大抽奖,其中的抽奖算法很有意思。

    抽奖算法:一、二、三等和喵喵奖 将按照如下规则及算法抽取:

    1. 选取 2016/11/01 11.00 am 之后产生的第一个bitcoin block

    2. 顺序使用这个block中包含的Transactions决定所有中奖者

    3. 方法:拿出第一个Transaction Hash比如 fc927205f394d537b17b9d0db45aa1388c63dfbf8be9c2b3e5c8dd6696f7cee7 字符串拼接 总奖券数量,比如 119394 张,取sha1("fc927205f394d537b17b9d0db45aa1388c63dfbf8be9c2b3e5c8dd6696f7cee7119394"),把结果转成integer:752844761200031861206594954675289876476750084715 ,和总奖券数量 119394 取模。得出的数字 57479 + 起始号码1000000 = 1057479 第一个中奖号码。

    4. 重复以上过程,直到抽出所有中奖者。如果有重复号码,就跳过它,取下一个Transaction Hash。

    5. 如果当前block所有Transactions都用完了,还没有抽取出足够的中奖者,就继续使用下一个block,方法不变。

    6. 我们会在所有奖券发送截至之后,上传奖券信息到github供大家查看。为了保护用户隐私,我们会隐去个人信息,上传格式为:奖券号码,发放时间,sha1。用户可以通过这个算法校验自己/以及其他朋友的奖券是否符合这个规则。

    7. 如果10天内没有成功联系到该获奖者,将会使用原号码+1替代作为新的获奖者。如此类推。

      抽奖的计算代码已开源,https://github.com/planetcoder/readerLottery

      这段代码利用bitcoin的随机性产生抽奖活动的中奖号码。

    使用方法:

    1. 在 https://blockexplorer.com 选取某个时刻的 BlockHash (具体使用哪个时刻根据抽奖活动规则确定)
    2. 运行脚本 ./lotteryResult.py blockhash number total startnum

    参数说明:

    • blockhash 某个时刻的BlockHash
    • number 总共中奖人数,比如50个
    • total 全部发出的奖券数量,比如 59391 张
    • startnum 奖券号码起始值,为了奖券号码好看,一般用一个比较大的数值做为开始,我们一般采用 1000000

    例子:

    ./lotteryResult.py 000000000000000003eaa089e640ea339a4f5c83721a607c1075d3443a834e84 50 59391 1000000
    
    result 0 is 1026155
    result 1 is 1055107
    result 2 is 1056394
    result 3 is 1010464
    result 4 is 1047703
    result 5 is 1033045
    ......
    

    以上号码即为各中奖结果

  • 相关阅读:
    MVC分部视图@Html.Partial
    MVC分部视图@Html.Partial
    DevExpress ASP.NET
    DevExpress ASP.NET
    @Html.Partial,@Html.Action,@Html.RenderPartial,@Html.RenderAction区别
    @Html.Partial,@Html.Action,@Html.RenderPartial,@Html.RenderAction区别
    MVC中@Html.Action的用法(类似自定义控件)
    MVC中@Html.Action的用法(类似自定义控件)
    C#.Net下的防抖Debounce和节流阀Throttle功能实现
    C#.Net下的防抖Debounce和节流阀Throttle功能实现
  • 原文地址:https://www.cnblogs.com/littlewriter/p/6021207.html
Copyright © 2020-2023  润新知