今天见同事贴了张照片,是网易大楼前有人拉横幅声讨“一元购” 这个产品的。
我之前没有听说过,上网搜了一下,发现最近搞这个的满多。大概就是说,每个玩家出一块钱买一个很贵的东西。然后系统把这些人凑在一起抽签,抽到谁谁就拿走那个东西。
比如一部手机卖 5000 块,有 5000 个人想买,一个人出一块钱,最后也只有一个人拿到货,其他人都损失了一块钱。
这不就是卖彩票么?
当然凑不到 5000 个人也没关系,系统(庄家)可以买走大部分票,这并不影响个人参与者中奖概率。当然,前提是庄家没有作弊,抽签是公平的。
那么庄家有没有办法作弊呢?
我们来看看网易“一元夺宝”的规则:
摘录如下:
商品的最后一个号码分配完毕后,将公示截止该时间点本站全部商品的最后50个参与时间;
将这50个时间的数值进行求和(得出数值A)(每个时间按时、分、秒、毫秒的顺序组合,如20:15:25.362则为201525362);
为保证公平公正公开,系统还会等待一小段时间,取最近下一期中国福利彩票“老时时彩”的揭晓结果(一个五位数值B);
(数值A+数值B)除以该商品总需人次得到的余数 + 原始数 10000001,得到最终幸运号码,拥有该幸运号码者,直接获得该商品。
其实能保证公平的关键在 3 ,引入了一个第三方看起来比较公正的随机数。除此之外的所有参数都是可以庄家作假的。
我想讨论一下,如果这个第三方随机数是公正的前提下,一元购的庄家还有没有机会作弊。
首先,这个外部随机数是个 5 位数,如果参与人数并非固定,那么经过对人数取模后,每个号码的分布并不是完全一致的,虽然偏差很小,但是有一定的作弊空间。所以、规则上若想回避,参与人数不可以大于 5 位数,且最后能除尽 100000 。直观上说,每组人数最好是 100 , 1000, 5000 这样的。
其次,我觉得最大的规则漏洞是,同时进行的多组抽签都依赖了这个单一随机数,这使得庄家很容易钻空子。比如,如果每组人数是 100 的话,庄家只要同时开 100 组。如果第三方随机数是多少,他都有办法在其中一组中作弊成功。通俗点讲,庄家在不同组买全了所有号码,且这个购买时无成本的。它要做的只是操作其它变量看起来符合结果就够了。
以上讨论仅仅只是说明庄家有没有作弊的空间,并非说网易或是别家经营这个业务的庄家真的有作弊行为。我相信这个玩法的盈利点和卖彩票差不多,根本不必靠作弊就可以赚钱。只需要把 3000 块成本的商品在平台上标 5000 就自然可以赚大头了。
本质上就是赌博,我是很不喜欢的。
如果不考虑用户的操作成本和理解成本,有没有可能指定一个更好更公平的规则,尽量回避庄家作弊呢?
我想最简单的做法是不依赖第三方随机数,而让参与人变成随机数提供者。
比如:如果有 100 个人参加抽签,那么先给 100 人发号。然后每个人自己产生一个随机数(自己想的还是自己用工具 app 产生的无所谓),并给一个足够长的随机串做盐。
大家用一个公开 hash 算法计算 hash(随机数 , 盐) 得到一个 hash 串,提交给组织者(庄家)。以上过程可以由 app 完成,为了提高 app 可信度,允许用户自己在 app 外计算,只提交 hash 串;同时给信任 app 的人提供更方便的自动计算功能。
等所有人提交完后,公示每个人的提交串,然后进入开奖流程。
开奖流程要求每个参与者提交原始随机数和随机盐,服务器和之前的 hash 串比对。任何一个人错误提交或不提交,都会导致这局游戏流掉。系统没收资本,扣除个人信誉值,并把其它投注退还给遵守规则的参与者。
如果所有人都提交,把数字加起来,得到中奖人的号码。
在这套规则里,任何人不参与开奖流程都会导致无法开奖,所以是相对公平的。如果有人恶意不开奖,或庄家做假(发现自己开了后会导致真正玩家中奖而不开),用户就得依靠查阅同组人的信誉值甚至历史来决定自己是否要跟他们玩了。
系统(庄家)可以帮助用户撮合信誉度高的用户在同一组里。
这套规则的一个风险是,庄家对玩家的信誉值作假;比如给一个机器人很高的信誉,这点需要玩家警惕,也比较容易被发现。庄家作弊风险很大。
另一个风险是,庄家如果拥有很强的计算力和很长的开奖时间,可能暴力解出玩家提交的随机数。这点需要通过加长盐和加大随机数的取值范围来缓解。