V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX 提问指南
xatest
V2EX  ›  问与答

征集一种对回复抽多个奖的随机算法,回复方案必感谢~

  •  
  •   xatest · 2020-01-09 09:54:14 +08:00 · 1522 次点击
    这是一个创建于 1562 天前的主题,其中的信息可能已经有所发展或是发生改变。
    我指的是,我发的 /t/635728 这个帖子~
    我把回复参与抽奖的资格,最晚截止到今晚 23:59:59,应该按什么随机算法抽 3 个奖?
    例如:拿具体数字来说,一共收到 1024 个回复,怎么以一个公正+随机的算法来抽[1,1024]区间的 3 个整数?

    凡是回复方案,无论方案好坏必感谢~
    13 条回复    2020-01-09 15:39:57 +08:00
    lhx2008
        1
    lhx2008  
       2020-01-09 09:56:33 +08:00 via Android   ❤️ 1
    random.shufile([x for x in range(1, 1025)])[:3]
    wolfie
        2
    wolfie  
       2020-01-09 10:01:45 +08:00   ❤️ 1
    每个楼层[用户 + 楼层数]md5
    当天博彩、股票或者其他的 md5
    对比取最近。
    https://www.jianshu.com/p/6577075ee118
    psychoo
        3
    psychoo  
       2020-01-09 10:04:07 +08:00   ❤️ 1
    3 个预定未来时刻的比特币价格%1024
    ferock
        4
    ferock  
       2020-01-09 10:07:40 +08:00   ❤️ 1
    这个世上有真随机的事情吗?如果不纠结这点,Rand 不就行了。。。
    Mutoo
        5
    Mutoo  
       2020-01-09 10:18:35 +08:00   ❤️ 1
    提前 shuffle 好一个 1 到 1024 的数组,并带上时间戳,然后进行 md5 并只把 md5 发论坛上。
    到期后公布这个数组就行了,大家可以自行 md5 验证。

    以上作法有一个小问题,就是 LZ 提前知道结果,有可能进行抢楼,所以最后可以在这个数组上取一个不可控因素作偏移量。也就是传统的抽取一楼的方法。
    BiteTheDust
        6
    BiteTheDust  
       2020-01-09 10:20:46 +08:00   ❤️ 1
    直接 rand 一个正常的 rand 函数 在随机范围内的概率都应该是要求非常近似的 你自己动脑筋随机出来的 反而可能做不到公平
    sockpuppet9527
        7
    sockpuppet9527  
       2020-01-09 10:35:05 +08:00   ❤️ 1
    直接回复的

    可以参考下这篇论文 P. L'Ecuyer, "Maximally Equidistributed Combined Tausworthe Generators", Mathematics of Computation, 65, 213 (1996), 203--213.
    有内核工具的 random 是参考这篇文章写的,量足够大的情况下它能保证公平以及范围足够大。
    fio 实现 : https://github.com/axboe/fio/blob/master/lib/rand.c

    fio 的随机算法目的是在 randrw 的情况下保证全盘公平覆盖。。所以和你的目的差不多,你只需要取三次即可
    xatest
        8
    xatest  
    OP
       2020-01-09 11:00:03 +08:00 via iPhone
    xiao17174
        9
    xiao17174  
       2020-01-09 11:00:52 +08:00   ❤️ 1
    # -*- coding: UTF-8 -*-
    import random

    #明天开盘时的上证指数*100 的值
    sh_value = 3083.39
    #楼层总数
    msg_count=1234

    #初始化随机值
    random.seed(sh_value * 100)
    seed2 = random.randint(1,9999)
    random.seed(seed2)

    //开始抽奖
    print "第一个中奖者楼层:%d" %random.randint(1,msg_count)
    print "第二个中奖者楼层:%d" %random.randint(1,msg_count)
    print "第三个中奖者楼层:%d" %random.randint(1,msg_count)
    print "第四个中奖者楼层:%d" %random.randint(1,msg_count)
    #如果上面有重复,后者用候补顶替
    print "候补中奖者一:%d" %random.randint(1,msg_count)
    print "候补中奖者二:%d" %random.randint(1,msg_count)
    pangleon
        10
    pangleon  
       2020-01-09 11:08:51 +08:00
    @wolfie 好思路!
    xiao17174
        11
    xiao17174  
       2020-01-09 11:10:02 +08:00
    解释一下:
    1.原理是给伪随机数生成器一个确定的种子,那么他的随机数生成也变得确定了.保证结果可重现.
    2.用这个算法,就要等到明天 9 点 30 开奖,如果想立即开奖,也可以改成今晚 12 点的比特币价格或者其它国家的股市收盘价格(建议用开 /收盘价格,它是一个定值,而比特币时刻在变).
    3.运行环境可以用在线 python 工具(比如 https://c.runoob.com/compile/9)或者指定 python 版本来保证结果可重现.
    4.可以再多加几层混淆,但是我觉得没必要了.
    Kelan
        12
    Kelan  
       2020-01-09 13:59:05 +08:00
    @wolfie 这个文章里的方法其实也解决不了他说的所谓插入僵尸号的问题。没必要搞那么复杂的离散化。
    xatest
        13
    xatest  
    OP
       2020-01-09 15:39:57 +08:00
    @xiao17174 #11 感谢已发送~
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   2426 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 26ms · UTC 16:03 · PVG 00:03 · LAX 09:03 · JFK 12:03
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.