V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
qidizi
V2EX  ›  程序员

征求一开奖算法

  •  1
     
  •   qidizi ·
    qidizi · 2018-01-05 11:50:49 +08:00 · 2685 次点击
    这是一个创建于 2309 天前的主题,其中的信息可能已经有所发展或是发生改变。
    各位,下面有个问题,看看大家有没有更好的解决方案

    有一中奖数字区间 1~x ; x 是大于 1 的整数
    7 星彩每次随机选出 7 个球,每个球数字是 0~9 ;假设每次开出的球按顺序拼组数字后的数是 y

    问:什么算法可以根据 y 算出 x 区间的唯一中奖数字;且此算法从概率上来说,x 的每一个数字被选中的概率是一样的。

    算法 1:假如 用 y 取余 x 的算法会导致 1 机率很小,因为球开出 000000....00001 这样概率太小;


    算法 2:
    假如 y=1234567,x=1000,每次 x 按 10 等分,然后从左到右顺序使用 y 的每一个数字 r 取第 r 小段 z (注:y 的每位数字只会出现 1~9~0,所以 y 的 1 是对应第 1 小段,y 的 0 对应第 10 小段),z 再按 10 等分,循环余下的 y 数字取第几小段,最后到小段 z 是个数时就是 x 的中奖数字;推演:第 1 轮,y 的数字 r=1 对应 z=1~100 小段,第 2 轮 y 的数字 r=2 对应 z=11~20 小段,第 3 轮 y 的数字 r=3 对应 z=13,因为小段已经是最小单位不可再分,所以最后中奖数字是 13 ;若 y 的数字已经全部用完还不到个位数字,可以从头再来;

    算法 2 主要由第一个球的第一个数字决定。若能改进由 y 全部数字控制就比较好。
    9 条回复    2018-01-05 19:11:22 +08:00
    no1xsyzy
        1
    no1xsyzy  
       2018-01-05 13:13:37 +08:00
    比如 x=7,10^7 mod 7≠0,所以并不存在完全等概率。
    至于算法 1,在 x=7 的时候,开出 1+7*i, i=0,1,2,3,...都能得到最终=1
    重新看一遍取余
    vjnjc
        2
    vjnjc  
       2018-01-05 14:02:50 +08:00
    1 楼+1。
    感觉算法 2 太啰嗦,也不是等概率。
    你要么在 1 的基础上升级下算法,所有的数都是 1index 的
    假设 y 在区间[1, 10000000]中,x 在区间[1, 7],
    10000000 mod 7 = 3,那么把最后面 4 个数字单独走算法 3.

    也就是
    if x in [1,9999995]
    算法 1
    else
    算法 3

    所谓的算法 3 就是
    9999996 9999997 9999998 9999999 这 4 个数字均匀的映射到[1, 7]里面去,不好意思这个算法我写不出来(哈哈哈哈哈
    zoeyzhang
        3
    zoeyzhang  
       2018-01-05 15:59:06 +08:00
    根据 index 取值不就好了?
    ballshapesdsd
        4
    ballshapesdsd  
       2018-01-05 16:06:42 +08:00
    智商不够,看不懂算法 2
    ballshapesdsd
        5
    ballshapesdsd  
       2018-01-05 16:28:28 +08:00
    看了 2 楼,感觉楼主的问题是,如何把 x 面的均匀色子,变成 y 面的色子。
    y>x,明显不可能。
    y=x,不需要转换。
    x%y==0,很简单。
    x%y!=0,从我感觉上来讲,貌似不可能。把条件放宽一点,x 面的色子可以扔无数次,根据概率的加和和乘法原理,无论怎么组合,概率的分母都应该是 x 的 n 次方,x 的 n 次方%y 仍然!=0,所以貌似是无解的。

    不信你试试用 3 面的色子,看看能不能产生 1/2 的概率。
    qidizi
        6
    qidizi  
    OP
       2018-01-05 16:42:11 +08:00
    感谢各位围观,我补充一下,
    这个算法的目的是解决这个问题:

    奖品被设定成达到 n 人就开奖的形式;
    贡献值大的人中奖机会大;
    开奖方式够随机公平,能经得起“我们开奖方绝对无法做手脚”推论;


    所以我想了上面的方案。

    * 每人按先后顺序领号
    * 每人的贡献值基数是 1,根据上面的编号做先后顺序,以贡献值为区间组合得到一个连续的区间 1~x,也就是贡献是 10 的人且在第一位,那它的得奖区间为 1~10 ;
    * 人数达到后,公示 1 天;大家可以拿上面信息存档;
    * 第三方 7 星彩每期的开球是随机的 0~9 的数字,7 个球,刚好解决随机公正问题,设这个组合数为 y
    * 最后我们和用户都可以拿到存档区间 x 根据 y 计算出中奖那个数,然后,看它在那个人的中奖区间,
    * 最后,拥有这个区间的用户得到这个奖品;
    ballshapesdsd
        7
    ballshapesdsd  
       2018-01-05 16:47:37 +08:00
    贡献值是 x,10**7%x!=0 的情况下绝对做不到完全公平
    @qidizi
    shd
        8
    shd  
       2018-01-05 16:58:21 +08:00
    这其实就是一元夺宝吧,奖品 a 所需的贡献值为 100 分,相当于卖 100 元,每份 1 元,对应的幸运码[0-99],参与者按认购的份额获取随机幸运码,例如 a 认购 10 份,获取的应的幸运码例如[1, 3,5,19,28,45,58,59,79,91]这 10 个码,每人个参与者的码不同,一共一百个,最后根据外部彩票的数字用 100 取余,得到的幸运码即为开奖结果。
    qidizi
        9
    qidizi  
    OP
       2018-01-05 19:11:22 +08:00 via Android
    类似于 1 元夺宝,但是我们目的是足够的人参与情况下,贡献值与概率成正比,公平且不容置疑即可。因为变量只要用我们能触及的数据就有值得怀疑。大家可以提供另外一个方案也行
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   2220 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 26ms · UTC 06:04 · PVG 14:04 · LAX 23:04 · JFK 02:04
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.