征求一开奖算法

2018-01-05 11:50:49 +08:00
 qidizi
各位,下面有个问题,看看大家有没有更好的解决方案

有一中奖数字区间 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 全部数字控制就比较好。
2829 次点击
所在节点    程序员
9 条回复
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
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
2018-01-05 15:59:06 +08:00
根据 index 取值不就好了?
ballshapesdsd
2018-01-05 16:06:42 +08:00
智商不够,看不懂算法 2
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
2018-01-05 16:42:11 +08:00
感谢各位围观,我补充一下,
这个算法的目的是解决这个问题:

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


所以我想了上面的方案。

* 每人按先后顺序领号
* 每人的贡献值基数是 1,根据上面的编号做先后顺序,以贡献值为区间组合得到一个连续的区间 1~x,也就是贡献是 10 的人且在第一位,那它的得奖区间为 1~10 ;
* 人数达到后,公示 1 天;大家可以拿上面信息存档;
* 第三方 7 星彩每期的开球是随机的 0~9 的数字,7 个球,刚好解决随机公正问题,设这个组合数为 y
* 最后我们和用户都可以拿到存档区间 x 根据 y 计算出中奖那个数,然后,看它在那个人的中奖区间,
* 最后,拥有这个区间的用户得到这个奖品;
ballshapesdsd
2018-01-05 16:47:37 +08:00
贡献值是 x,10**7%x!=0 的情况下绝对做不到完全公平
@qidizi
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
2018-01-05 19:11:22 +08:00
类似于 1 元夺宝,但是我们目的是足够的人参与情况下,贡献值与概率成正比,公平且不容置疑即可。因为变量只要用我们能触及的数据就有值得怀疑。大家可以提供另外一个方案也行

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/420291

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX