V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
爱意满满的作品展示区。
xuboying
V2EX  ›  分享创造

没有作弊的抽奖程序

  •  
  •   xuboying · 2017-03-16 14:55:28 +08:00 · 5300 次点击
    这是一个创建于 2570 天前的主题,其中的信息可能已经有所发展或是发生改变。

    之前总是看到调侃要 review 抽奖程序的梗,突发奇想,直接在 IDE 里抽奖效果如何。

    111.gif

    第 1 条附言  ·  2017-03-16 15:30:38 +08:00
    这个程序里根本就没有随机数生成函数啊,梗里一直要 review 代码的同学到底会不会 review 啊。
    第 2 条附言  ·  2017-03-16 16:32:37 +08:00
    感觉是“梗”的诉求错了,要梗里要 review 代码的同学洗洗睡觉吧, hello world 级别的代码也不会信的。
    第 3 条附言  ·  2017-03-17 13:34:41 +08:00
    感觉程序员都好厉害啊,改寄存器,改屏幕,插帧都会。这么有能耐抽什么奖啊,自己造奖品好了。
    40 条回复    2017-03-18 15:47:02 +08:00
    aploium
        1
    aploium  
       2017-03-16 15:07:29 +08:00
    为什么不用 html+js 或者 python 这样的脚本语言?_?
    /*说不定人家直接魔改底层随机数生成器呢*/
    xuboying
        2
    xuboying  
    OP
       2017-03-16 15:09:21 +08:00
    @aploium 要改这个闭源 IDE 程序,修改 for 循环,你要黑了微软和 Intel 。。。
    mahone3297
        3
    mahone3297  
       2017-03-16 15:12:07 +08:00
    这种录屏幕,是用什么程序?
    zjcqoo
        4
    zjcqoo  
       2017-03-16 15:14:17 +08:00   ❤️ 1
    事实上只要是程序,总是能作弊的。可以在软件上,或者是硬件上,甚至显示上,总是能做他人看不到的猫腻的。

    要让大家信服的抽奖,只能依靠第三方客观数据(或者权威数据)生成随机数种子。比如 N 个城市的天气温度、 TOP 10 的股票数据等。之前写过一篇类似的: https://www.cnblogs.com/index-html/p/trusted-lottery-algorithm.html
    xuboying
        5
    xuboying  
    OP
       2017-03-16 15:19:16 +08:00
    @zjcqoo 你的前提是大家相信你上了一个真网站(无劫持,无错误 api ,网站也没 bug ),得到了真数据,然后程序没有 bug ,生成了真随机数。。。
    然后相信 "可以在软件上,或者是硬件上,甚至显示上,总是能做他人看不到的猫腻的。"的说法不成里

    -------------------------------
    我这个随机数是我手按 pause 的时刻生成的,你可以让任何人让来点,显然简单多了
    代码就两行,小学生也能看懂,
    然后相信 "可以在软件上,或者是硬件上,甚至显示上,总是能做他人看不到的猫腻的。"的说法不成里

    来吧,大家 review 我的代码吧
    xuboying
        6
    xuboying  
    OP
       2017-03-16 15:20:47 +08:00
    @mahone3297 LICEcap
    shoaly
        7
    shoaly  
       2017-03-16 15:27:03 +08:00
    所以必须是第三方的, 比如我就觉得 微信群里面 发 100 元红包, 最高的前三名 对应线下的大奖. 应该是绝对公平了
    xuboying
        8
    xuboying  
    OP
       2017-03-16 15:29:42 +08:00
    @shoaly 这个程序里没有随机数生成函数啊,要 review 代码的同学到底会不会 review 啊。
    xuboying
        9
    xuboying  
    OP
       2017-03-16 15:34:07 +08:00
    @shoaly 看错了,你是说是完全不用自己的程序。。。好吧,这样的办法也可以。
    aploium
        10
    aploium  
       2017-03-16 15:36:48 +08:00
    扔硬币吧扔硬币吧
    pungis
        11
    pungis  
       2017-03-16 15:44:34 +08:00
    你这和 1 楼没有本质区别,可以作弊的地方多了
    关键在于你没有让人绝对可以信服的证据

    密码学里早就有可以绝对让人信服的公平抽奖法了
    基于人,基于物理都不行
    只有基于数学才是绝对可靠的
    还是多学学吧
    xuboying
        12
    xuboying  
    OP
       2017-03-16 15:47:32 +08:00
    @pungis 这是一个面向 review 年会抽奖程序梗的应对方法。 请举出可以作弊的具体地方

    并提出你的方法
    binux
        13
    binux  
       2017-03-16 15:58:04 +08:00 via Android
    @xuboying 评估计算速度,按下停止
    xuboying
        14
    xuboying  
    OP
       2017-03-16 15:59:32 +08:00
    @binux 我小时候玩的小霸王学习机估计可行
    pungis
        15
    pungis  
       2017-03-16 16:03:54 +08:00
    @xuboying
    你是程序员吗?难以想象你问这种问题
    一台运行 windows 的电脑可以有无数种作弊的地方好吗?
    windows api 不懂?
    i 的值是不是在文本框?我写个进程 SetWindowText 行不行?
    你那结果最终不得是屏幕上显示?我覆盖一张图上去呢?

    我的方法上面都说了,自行 google 密码学掷硬币及其扩展
    caixiexin
        16
    caixiexin  
       2017-03-16 16:03:59 +08:00 via Android
    信任体系是建立在有一个所有人都信任的权威存在,就像 HTTPS 的 CA 。
    只要能说服所有人的话,剪刀石头布也能抽奖的嘛😌
    xdeng
        17
    xdeng  
       2017-03-16 16:06:08 +08:00
    随机生成函数 就是你自己 =.=
    shoaly
        18
    shoaly  
       2017-03-16 16:06:48 +08:00
    @xuboying 在场面上, 你说的话的真实性永远无法自证清白.
    因为抽奖本身并不是一个科学, 说再多, 听者并不能懂, 也不想懂, 他们只会简单的觉得 这玩意是你做的, 所以你能"控制".
    除非你跟抽奖这件事是完全不搭边, 毫无利益牵扯. 所以采用"第三方", 并不是从原理上更清白, 而是大家更容易相信
    typcn
        19
    typcn  
       2017-03-16 16:14:31 +08:00
    很简单啊。。。 Hook 一下绘图函数改数字就完了。。。。
    改一行汇编直接换寄存器值都没问题
    xuboying
        20
    xuboying  
    OP
       2017-03-16 16:23:06 +08:00
    @pungis 我同意你说的可以用系统 api 来处里,有心要做这种事情,你要搞障眼法,那无数的办法都可以。梗里面只是要 review code ,就给大家一个最简单的可以行的办法,因为 code 的好坏也会左右抽奖结果,这个错误可能是无心引入的。既然要 review ,就 review 大家都看不懂的。


    什么样的人群抽奖,要用什么样的方式
    你在老年人忽悠中心高抽奖,如果你拿个乒乓球,他们会接受,你写个程序,他们会给你一堆问题,这个电脑会不会有硬件“问题”,有没有黑客,你没法用电脑给他们抽奖

    梗是基于程序员的,年会抽奖,用的是熟悉的模式环境,熟悉的方法,你能想到的作弊我也能想到,一个 for 循环,估计没有任何流派的程序员看不懂吧,


    你硬要讲 google 的密码学,那么请你帮台下几千名程序员先普及一下密码学的知识,大家不要吃饭吃菜,听你上面滔滔不绝 4 个小时,然后还是没有听懂啊啊啊啊啊
    xuboying
        21
    xuboying  
    OP
       2017-03-16 16:23:46 +08:00
    @typcn 求发个 asm 版本的
    xuboying
        22
    xuboying  
    OP
       2017-03-16 16:31:02 +08:00
    @shoaly 我觉得你说的有道理,感觉是梗的诉求错了,要 review 代码的同学洗洗睡觉吧
    binux
        23
    binux  
       2017-03-16 16:39:59 +08:00 via Android
    @xuboying “梗是基于程序员的”,你是野生程序员吧
    jiangzhuo
        24
    jiangzhuo  
       2017-03-16 17:19:33 +08:00
    只要让所有人都信服就行了,无所谓公平不公平。本来大家就是想看看这群人里谁气运最好,奖品就归谁。既然是比气运就很容易了。
    拿年会抽奖这事来说,所有人聚集到一个屋子里,密封好,放毒气,同时死掉,看来世谁投胎比较好就行了。
    stnaw
        25
    stnaw  
       2017-03-16 17:20:09 +08:00
    用彩票号码当种子
    EricInBj
        26
    EricInBj  
       2017-03-16 17:22:43 +08:00
    我们抽奖是用北京车牌摇号一样的做法。
    伪随机算法,签到顺序形成数组,抽下标。
    种子数可以现场产生,每一桌随便找个人,说一个数字,然后把所有桌子的数字连起来。
    当然也可以去第三方网站产生一个随机数。

    不过现场产生的互动性效果好一点。
    EricInBj
        27
    EricInBj  
       2017-03-16 17:23:58 +08:00
    @sTnaw 这种有个问题,就是说种子得在抽奖编号产生之后确定下来才行。要不然还是可以操作的。过不了 review ,哈哈。
    xierch
        28
    xierch  
       2017-03-16 19:47:36 +08:00
    https://blog.sorz.org/p/p2p-lucky-draw/
    谁来把这个实现一下吧(
    loading
        29
    loading  
       2017-03-16 19:58:45 +08:00 via Android
    随便拿一台手机,打开 codepen.io
    用浏览器跑 js 。
    xierch
        30
    xierch  
       2017-03-16 20:24:58 +08:00
    @xierch 其实很简单啊,就是每个人自己生成一个随机数,藏着。所有人先公布 hash ,再公布随机数,
    最后用所有人的随机数据合起来生成结果。只要保证自己的数别人猜不到,就行了。

    先订好协议,取个帅气的名字,注册个时髦的域名,吸引不同的人写一些不同语言平台的开源实现。

    抽奖的时候,无所谓的人看着就好;想参与的人自己掏出手机开个网页、装个 app ,注入熵;认真的人,自己 review 代码自己编译或者干脆自己照着协议写一个。

    多好,现在就差一个程序员了。
    sgissb1
        31
    sgissb1  
       2017-03-16 21:38:17 +08:00
    关键你录屏的时候如何证明你没有插帧了?
    xuboying
        32
    xuboying  
    OP
       2017-03-16 22:31:09 +08:00 via Android
    @sgissb1 哥哥,用的时候观众自己上来看吧。重建工程也可以的,就 5 行。
    RqPS6rhmP3Nyn3Tm
        33
    RqPS6rhmP3Nyn3Tm  
       2017-03-17 02:44:05 +08:00 via iPhone
    开个浏览器, random.org
    再不济买个摇奖机,物理的怎么作弊
    blackboar
        34
    blackboar  
       2017-03-17 09:43:39 +08:00
    你怎么保证 IDE 没被动过手脚!

    问题的关键不在于用什么技术的,要找出一种办法让大多数人觉得公平就可以了,总是有个别人觉得有内幕有什么办法。
    sgissb1
        35
    sgissb1  
       2017-03-17 10:23:22 +08:00
    @xuboying 大哥,现在可以动态插入帧的。。。所以我只想说天下没有不舞弊的事情,因为不舞弊要做到公正公开。因为你直播也好,录播也罢,就算把人聚集在电脑前写代码抽奖也一样,如何证明每一幅画面就是原始的真实的。
    sgissb1
        36
    sgissb1  
       2017-03-17 10:23:46 +08:00
    @blackboar 这个场子砸的我点 32 个赞!
    xuboying
        37
    xuboying  
    OP
       2017-03-17 13:29:19 +08:00
    @sgissb1 取消抽奖环节,结贴
    xuboying
        38
    xuboying  
    OP
       2017-03-17 13:31:55 +08:00
    @blackboar 没有办吧保证 IDE 没有被动过手脚,也不能保证发给你的奖品是真货,所以取消抽奖环节吧。
    sgissb1
        39
    sgissb1  
       2017-03-17 13:54:21 +08:00
    @xuboying 从抽奖到放弃, 2333333 。你被大家各种压制的飞起
    sobigfish
        40
    sobigfish  
       2017-03-18 15:47:02 +08:00
    我还见过直接用微信摇一摇的
    -。- 其实感觉这样的节奏还行,谁也作不了弊(除非你加了抽奖主持的微信号,[可能]会再也摇不到你)
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   2762 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 28ms · UTC 12:26 · PVG 20:26 · LAX 05:26 · JFK 08:26
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.