V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
这是一个专门讨论 idea 的地方。

每个人的时间,资源是有限的,有的时候你或许能够想到很多 idea,但是由于现实的限制,却并不是所有的 idea 都能够成为现实。

那这个时候,不妨可以把那些 idea 分享出来,启发别人。
zhihupron
V2EX  ›  奇思妙想

公司年会抽奖使用 Math.random()函数是否有失公平?

  •  
  •   zhihupron · 2019-12-19 10:56:17 +08:00 · 20352 次点击
    这是一个创建于 1830 天前的主题,其中的信息可能已经有所发展或是发生改变。
    每个人有一张刮刮卡卡片。刮开后有编号,然后使用 javascript 生成随机数
    https://www.runoob.com/jsref/jsref-random.html
    第 1 条附言  ·  2019-12-21 09:02:17 +08:00
    104 条回复    2019-12-24 13:38:35 +08:00
    1  2  
    piloots
        1
    piloots  
       2019-12-19 11:01:48 +08:00
    没有
    wqzjk393
        2
    wqzjk393  
       2019-12-19 11:08:03 +08:00
    使用 random 作为 random 种子,然后再套几层 random,这下总公平了吧
    runinhard
        3
    runinhard  
       2019-12-19 11:10:14 +08:00
    楼主是想讨论技术问题还是公平问题
    malthae
        4
    malthae  
       2019-12-19 11:13:46 +08:00
    LZ 想说程序随机并不是真正的随机
    radiocontroller
        5
    radiocontroller  
       2019-12-19 11:15:17 +08:00   ❤️ 2
    比暗箱操作公平
    whp1473
        6
    whp1473  
       2019-12-19 11:15:38 +08:00
    Java 中带有一个安全的 Random,采集随机因子生成,可以考虑用那个
    willxiang
        7
    willxiang  
       2019-12-19 11:16:13 +08:00   ❤️ 11
    被抽到的人觉得公平,没抽到的人觉得不公平。
    TomatoYuyuko
        8
    TomatoYuyuko  
       2019-12-19 11:16:43 +08:00
    没什么不?
    est
        9
    est  
       2019-12-19 11:17:08 +08:00
    其实我觉得抢楼是最公平的。几乎没法作假。
    LZSZ
        10
    LZSZ  
       2019-12-19 11:25:45 +08:00
    没人发一份最公平
    Bakumon
        11
    Bakumon  
       2019-12-19 11:30:26 +08:00   ❤️ 1
    如果每人的刮刮卡也是随机抽取的,那就是绝对公平的
    marcong95
        12
    marcong95  
       2019-12-19 11:38:29 +08:00
    random.org 如何?
    xiaocongcong
        13
    xiaocongcong  
       2019-12-19 11:43:59 +08:00
    你是没见过领导在台上说 不在场抽奖作废,抽下一位。结果抽到部门领导不在场啪啪啪打脸,差那么几百块奖品吗。而且公司是就是做软件的,硬要去别人网站花 1000 买个抽奖软件。。。。
    zpfhbyx
        14
    zpfhbyx  
       2019-12-19 11:48:46 +08:00
    人少的话 全员红包,最佳领奖啊
    pompeii
        15
    pompeii  
       2019-12-19 11:49:04 +08:00
    具体不公平在哪?
    fuxiaohei
        16
    fuxiaohei  
       2019-12-19 11:50:35 +08:00
    就几十几百个数值,谈啥分布平均。。随意就好
    Pastsong
        17
    Pastsong  
       2019-12-19 11:50:55 +08:00
    @zpfhbyx #14 微信红包随机更不准,最后一个领的最多的概率大很多
    jojogl
        18
    jojogl  
       2019-12-19 11:51:22 +08:00
    不是有用某个时间点的上证或者别的什么指数来做随机数的么....
    这个还不够随机那就比特币上?
    tangzh55
        19
    tangzh55  
       2019-12-19 11:53:46 +08:00   ❤️ 1
    啥?还有年会,还有奖抽
    grimpil
        20
    grimpil  
       2019-12-19 12:01:32 +08:00 via Android
    抽奖不助手不香么
    arvinsilm
        21
    arvinsilm  
       2019-12-19 12:03:41 +08:00
    用当天股票开盘、最近一期彩票、当天 PM2.5、气温、风速等等等等,完全规避暗箱操作
    unixeno
        22
    unixeno  
       2019-12-19 12:08:03 +08:00 via Android
    binux
        23
    binux  
       2019-12-19 12:11:18 +08:00
    @xiaocongcong #13 给你一天时间能开发一个比别人网站更好的抽奖软件吗?如果不能,买一个又如何。
    xenme
        24
    xenme  
       2019-12-19 12:12:40 +08:00 via iPhone
    号码牌按照到场顺序随机拿也可以
    q8164305
        25
    q8164305  
       2019-12-19 12:15:25 +08:00 via Android
    @Bakumon 如果刮刮卡也是根据某个数值 random 的呢?最终还不是一样
    JJstyle
        26
    JJstyle  
       2019-12-19 12:16:53 +08:00 via iPhone
    人手一个大奖就公平了
    Mutoo
        27
    Mutoo  
       2019-12-19 12:28:25 +08:00   ❤️ 1
    import './utils';

    utils.js
    -------
    Math.random = () => 42; // rolled from my dices.
    zoffy
        28
    zoffy  
       2019-12-19 12:38:28 +08:00   ❤️ 21
    你们公司的人是有本事预测 Math.random 的结果还是怎么滴?
    wdhwg001
        29
    wdhwg001  
       2019-12-19 12:49:17 +08:00 via iPhone
    http://random.irb.hr/
    可以使用量子随机数发生器。
    chickenJuicer
        30
    chickenJuicer  
       2019-12-19 13:12:33 +08:00
    我觉得楼主需要解释一下什么叫 公平
    shintendo
        31
    shintendo  
       2019-12-19 13:12:59 +08:00   ❤️ 4
    每个员工自己想一个整数,写在 txt 里,压缩包加密码,上传,抽奖时每个人报出密码,现场解压,所有整数加在一起,对总人数取余,得中奖号码(狗头)
    yaapoo
        32
    yaapoo  
       2019-12-19 13:27:12 +08:00 via iPhone
    @Pastsong 微信红包不是随机的,是有几个分布模型制作的
    sockpuppet9527
        33
    sockpuppet9527  
       2019-12-19 13:40:04 +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
    sockpuppet9527
        34
    sockpuppet9527  
       2019-12-19 13:42:34 +08:00
    @wqzjk393 #2
    你只有保证嵌套的 random 函数每一个 random 函数都是公平的整个 random 函数才算公平。
    那么问题回来了,既然已经保证了其中每一个 random 函数都是公平的为什么还需要进行嵌套?
    chocotan
        35
    chocotan  
       2019-12-19 13:45:51 +08:00
    实践是检验真理的唯一标准
    生成一百万个随机数,看是否是平均分布的
    519718366
        36
    519718366  
       2019-12-19 13:52:00 +08:00
    公司其他部门 mou 同事:我不管,你们 IT 抽到大奖,就是抽奖程序做手脚。🌚
    whypool
        37
    whypool  
       2019-12-19 14:02:26 +08:00
    比内定公平
    RBQMT
        38
    RBQMT  
       2019-12-19 14:10:08 +08:00
    需要一个集装箱,在里面放若干数量的猫,每个猫上都有号码,然后开始薛定谔吧
    HeyWeGo
        39
    HeyWeGo  
       2019-12-19 14:13:47 +08:00
    HeyWeGo
        40
    HeyWeGo  
       2019-12-19 14:15:38 +08:00
    要不抽奖前,放一遍上面的视频,讲解下计算机随机的实现?觉得不公平的自己去搞个真随机去~
    missqso
        41
    missqso  
       2019-12-19 14:54:50 +08:00
    哈哈哈 代码公平 程序正确 。除非用量子力学来生成(目前能够做到的)真随机。不然所有的办法都只是五十步笑百步,程度不同而已。年会就图个乐得了。有同事纠结的话,不如把 random 的种子设置为当天的一些特殊数据,比如与会人数啊之类的。或者干脆大屏直播摇骰子得了
    DelayNoMore
        42
    DelayNoMore  
       2019-12-19 15:07:44 +08:00   ❤️ 2
    公平。就算 random 不是真随机,你拿刮刮卡的时候是真随机就可以了
    rizon
        43
    rizon  
       2019-12-19 15:43:59 +08:00
    这得看刮刮卡的数字是哪来的,如果数字从 0 或 1 开始按顺序排下来,我觉得是有些尴尬的,所以刮刮卡的数字也是随机的,抽取刮刮卡也是随机的。

    简而言之就是避免两头冷门数字,让所有刮刮卡的值尽量集中在热区。
    比如你 1000 个人抽奖,那你觉得可能抽到 0 或 1000 吗。。。这不能单纯用概率说话,所以刮刮卡的数字至少应该都集中在 2 位数或 3 位数以上比较好吧。

    以上为个人见解,欢迎讨论
    x86
        44
    x86  
       2019-12-19 15:44:46 +08:00
    有什么不公平的?
    rizon
        45
    rizon  
       2019-12-19 16:00:46 +08:00   ❤️ 2
    @rizon #43 当然我说的是怎么让抽奖这件事更加有悬念和刺激,

    至于公平则是另一个复杂的问题了,

    这世界没有不公平的事情!!!!
    这世界没有不公平的事情!!!!
    这世界没有不公平的事情!!!!

    你的一生,你的命运就是这样分配给你的,你去讨论公平本来就没有意义,在想公平之前,先问一下,谁给你的公平?谁来维护公平,所谓的公平永远都是为了维护弱者权益所产生的概念而已。 强弱是大自然的自然存在,难道这也是不公平的吗?这是大自然的基本法则而已。


    让我想起另一件事情,我很小的时候这样想过,你本就是不存在的,只是上帝赋予了灵魂,才产生了你,把一个灵魂装在你的身体里,然后又装在另一个身体里,扔在不同的环境里,这个灵魂便在思考不同的事情,所以大家都是一个灵魂,都是一个人而已,我即众生,众生即我。

    当然,我半夜下班骑着自行车回家,看着路上豪车的时候就不这么想了。。。。。。活着,怪累,挺不得劲的
    shintendo
        46
    shintendo  
       2019-12-19 16:15:23 +08:00   ❤️ 4
    被楼上逗笑了
    gloye
        47
    gloye  
       2019-12-19 16:18:28 +08:00 via iPhone
    加个洗牌算法就行了
    LiuJiang
        48
    LiuJiang  
       2019-12-19 16:35:00 +08:00
    这不很公平嘛
    xiaocongcong
        49
    xiaocongcong  
       2019-12-19 16:54:23 +08:00
    @binux ????谁说一天的?现在 v2 也和知乎一样喜欢杠了?我都不想喷你,我们公司自己平时都有给客户的抽奖活动,每次放 iphone 抽中概率备注都是 0
    liuxey
        50
    liuxey  
       2019-12-19 16:59:40 +08:00
    想起以前现场用箱子抽奖,不是公司领导就是部门负责人
    tantalu
        51
    tantalu  
       2019-12-19 17:08:02 +08:00
    随机数种子是谁定的?
    Unclev21x
        52
    Unclev21x  
       2019-12-19 17:14:38 +08:00
    @shintendo 本来我略过了,看你这么一说,我又回头看了下,然后我也笑😀了。
    yousabuk
        53
    yousabuk  
       2019-12-19 17:44:14 +08:00 via iPhone
    都是公平的,真随机假随机都是公平的。
    yangzzzzzzzt1
        54
    yangzzzzzzzt1  
       2019-12-19 17:47:48 +08:00
    srand(time(NULL))不就好了
    snw
        55
    snw  
       2019-12-19 18:01:00 +08:00 via Android
    我们是用 Excel RAND()按住 F9 来抽的😂
    iamverylovely
        56
    iamverylovely  
       2019-12-19 18:04:19 +08:00
    ```
    Math.random=function(){return "楼主中奖"};
    //这样公平了吧。
    ```
    iamverylovely
        57
    iamverylovely  
       2019-12-19 18:05:40 +08:00
    ## 回复居然不支持 markdown
    wwwe
        58
    wwwe  
       2019-12-19 18:06:25 +08:00 via Android
    tianshilei1992
        60
    tianshilei1992  
       2019-12-19 18:13:30 +08:00 via iPhone
    我还记得我们当时年会的抽奖代码是 PE 现场开投影仪写的😂
    shiny
        61
    shiny  
       2019-12-19 18:15:46 +08:00
    抽奖现场 code review
    paranoiagu
        62
    paranoiagu  
       2019-12-19 18:20:44 +08:00 via Android
    random 跳数字是真的,停下来的数字是指定的。以前客户要求的套路。
    SteveAlan
        63
    SteveAlan  
       2019-12-19 18:30:52 +08:00 via iPhone
    比内定公平
    ZehaiZhang
        64
    ZehaiZhang  
       2019-12-19 18:52:53 +08:00
    @tianshilei1992 现场写可还行,我觉得双方心理都平衡了
    JCZ2MkKb5S8ZX9pq
        65
    JCZ2MkKb5S8ZX9pq  
       2019-12-19 19:16:22 +08:00   ❤️ 1
    楼主可能本来是想讨论 random 函数的随机问题,无奈好多人都歪楼了。

    不过我也要歪个楼。
    作为一个干过游戏企划的,想提提其它方案。

    比如有一个简单的模型,是主持方给出一个选项,比如黑或白,所有玩家站队,立定后揭晓。二分法几次之后出结果,这样既有参与感,也有悬念。

    然后尝试在这个模型上做扩展。比如把用户这头的纯随机,变成答题之类的更有参与感和主动性的方式,比如关于公司的问题,然后站队获奖。

    又或者把责任转嫁到开奖一方,比如让各部门 leader 做一些简单的比赛,玩家选 leader 站队。当然这样要看公司领导是不是愿意参与和拉得下脸。

    当然这里也有如何设计作弊的方法。但抽奖本质上是一种分配,认知上的公平和现场气氛的把握,和各种人情关系和玩家性格习惯,可能都要考虑。
    shuang
        66
    shuang  
       2019-12-19 19:43:31 +08:00
    不要你觉得,要我觉得,公不公平我说了算!!!



    这不是一个技术问题
    ma836323493
        67
    ma836323493  
       2019-12-19 19:45:35 +08:00
    取当天温度湿度, 计算 随机
    zqx
        68
    zqx  
       2019-12-19 20:01:01 +08:00 via Android
    math 库的实现和宿主环境有关,random 通常与设备 cpu 中的时钟有关,在多线程语言中可能存在两个线程的随机种子一样的情况,但 javascript 是单线程的,因此是相对公平的。
    xuanbg
        69
    xuanbg  
       2019-12-19 20:54:21 +08:00
    抽出来的号虽然不是真随机,但你拿到什么号却是比珍珠还真的真·随机数呀。事实上根本不需要摇号,抽卡前就直接公开 1-xx 号分别是什么奖都没问题。因为谁也不知道哪张纸片印着这几个号码,公平的很。
    binux
        70
    binux  
       2019-12-20 00:22:37 +08:00 via Android
    @xiaocongcong #49 1000 块也就是一天的工资。怎么,你还想半天完成?
    Mutoo
        71
    Mutoo  
       2019-12-20 07:29:26 +08:00
    最大的问题上面提到了,Math.random 可以被自定义函数覆盖掉,如果不配合 code review 的话,无法保证公平公正。
    FS1P7dJz
        72
    FS1P7dJz  
       2019-12-20 07:53:46 +08:00
    @wqzjk393 你这个想法是错误的哦,如果不是真随机,这种嵌套反而会导致结果更加可以预测
    fatpower
        73
    fatpower  
       2019-12-20 08:53:56 +08:00   ❤️ 1
    你们在纠结这个,我司 2 年没年会了,惨淡
    Arrowing
        74
    Arrowing  
       2019-12-20 08:56:39 +08:00 via Android
    不要简单地用技术问题来衡量现实问题
    seenthewind
        75
    seenthewind  
       2019-12-20 09:09:02 +08:00
    概率上的随机,和数学上的随机是两回事情。

    当然年会抽奖随机是不一样的第三件事情。

    作为过来人我和你说,我都试过,直接内部开源最好。
    vexjoe
        76
    vexjoe  
       2019-12-20 09:26:51 +08:00
    @sockpuppet9527 有不少人都是这个思维,以为粗暴的方法可以"简单"的就解决问题,而没有深入去思考这个问题是不是真的被消灭了,不知道自己只是把问题给延后了或者变得更加复杂难以排查了。
    Eugene1024
        77
    Eugene1024  
       2019-12-20 09:32:36 +08:00
    使用 random 产生随机数没啥值得质疑的,可能质疑的是你写的代码有缺陷导致每个人中奖率不一样,或则你在程序里故意设计某些人中奖率高
    hoythan
        78
    hoythan  
       2019-12-20 09:32:42 +08:00
    random 是能当场猜出来吗?
    kop1989
        79
    kop1989  
       2019-12-20 09:36:00 +08:00
    严谨一些的话,可以尝试引入一些完全不相干的第三方参数,这个参数最好是无规律变动的。比如当前时间的上证指数,当前的空气质量,某个网站的日活人数,某个话题的百度指数等。
    expkzb
        80
    expkzb  
       2019-12-20 09:46:38 +08:00
    在领取刮刮卡的时候已经是随机了,应该不用担心 random 函数不够随机的问题
    InkStone
        81
    InkStone  
       2019-12-20 09:51:43 +08:00
    @binux 看楼主的意思,也就是一个简单的随机+UI,又没什么额外的业务需求。最大的成本都在 UI 上,我觉得半天都多了。
    blackywkl
        82
    blackywkl  
       2019-12-20 09:56:21 +08:00
    javascript 的 Math.random 貌似不是均匀分布的
    Phariel
        83
    Phariel  
       2019-12-20 10:02:52 +08:00 via iPhone
    每一年年尾都会有这种帖子出现

    random.org 包治百病!!!
    xiaocongcong
        84
    xiaocongcong  
       2019-12-20 10:12:14 +08:00 via iPhone
    @binux 您时间可真值钱,像我们这种工资不高时间又多整天上班没什事情干的人真的是很廉价呢
    zxxufo008
        85
    zxxufo008  
       2019-12-20 10:26:53 +08:00
    为什么我想到了让子弹飞
    Accelerant
        86
    Accelerant  
       2019-12-20 10:31:24 +08:00
    RDRAND 了解一下
    atbility
        87
    atbility  
       2019-12-20 10:51:32 +08:00
    从概率论与统计学角度来看,挺公平的
    sa2501
        88
    sa2501  
       2019-12-20 10:58:33 +08:00
    差不多得了,都用上 Math.random 还不行,你看看人家用 excel 按上下贱抽奖的
    chenyu8674
        89
    chenyu8674  
       2019-12-20 11:02:43 +08:00
    之前帮行政做了个页面随机切换员工照片,让领导用拍减压大回车来停止,场面效果非常不错
    Owenjia
        90
    Owenjia  
       2019-12-20 11:03:34 +08:00
    建议使用 CSPRNG,现在主流浏览器都有对应实现了。
    lands
        91
    lands  
       2019-12-20 11:35:38 +08:00
    @519718366 真实心理, 哈哈
    Kv_se7en
        92
    Kv_se7en  
       2019-12-20 13:45:59 +08:00
    很简单啊,你运行十万次 Math.floor(Math.random() * 10) ,然后统计产生的 1- 10 这是个数字是否分布均匀就可以了。
    mostkia
        93
    mostkia  
       2019-12-20 14:49:52 +08:00
    只要不重号就可以了,怕不随机多嵌套一下,然后加点佐料喽,比如引入时间、鼠标 XY 轴做种子。
    Hyeongo
        94
    Hyeongo  
       2019-12-20 15:08:58 +08:00
    上家公司是在抽奖箱里抽刮刮卡,后面抽的人箱子里都没奖 了
    whalegao
        95
    whalegao  
       2019-12-20 17:41:06 +08:00 via iPhone
    随机数不一定是均匀分布的 有很多是服从正太分布的
    KentY
        96
    KentY  
       2019-12-20 18:59:35 +08:00
    至于真伪随机数, 以及分布问题这个网上大把文章. 我想说的是, 你们公司干嘛用程序来做啊?! 年会是集会对吧, 我们也有, 开会, 讲话, 聚餐等. 你们每人有个卡, 每个号码有个副券对应, 放箱子里, 抓阄多好!

    而且可以让普通员工上台露面抽奖, 比如 财务之星, 销售大王... 如果都是技术人员, "年度代码提交量最多", "注释最多", "后端王子", "前端皇后"..... 多有意思, 上场抽奖时候还能后面大屏幕播放一些他 /她的有关背景...
    songkeys
        97
    songkeys  
       2019-12-20 22:53:22 +08:00
    其实从宇宙大爆炸开始,所有的粒子、物理效应、化学反应都遵循着定律,这个世界就不是随机的了。

    即使是你的思考,也只是身体里的一系列化学反应产生了脑神经中的电信号,也是要遵循定律的,可以说也是能预测的。自由意志或许都不存在。楼主提出这个问题,楼下的所有的人进行回复,我打下这一段字……其实都从宇宙大爆炸开始的那一刻决定好了。
    tzm41
        98
    tzm41  
       2019-12-21 01:36:42 +08:00
    @songkeys 这个得取决于你相信的量子力学诠释了…如果你相信哥本哈根诠释,那世界确实是有真实随机性的。
    loading
        99
    loading  
       2019-12-21 01:38:15 +08:00 via Android
    @est 抢楼更容易作假,服务端预设。
    crab
        100
    crab  
       2019-12-21 02:17:06 +08:00
    随机公平了。怕的是抽奖界面真随机,但出结果是预先设定的就尴尬了。
    1  2  
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2798 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 29ms · UTC 11:45 · PVG 19:45 · LAX 03:45 · JFK 06:45
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.