最近抢了几场演唱会的票都没有抢到,果然票务就是最大的黄牛。想着要是票务能采用公平公正的抽签方式就好了,这样多少还能有点机会。
突然想到了金币云商用的一种比较公平公正的抽签算法,那就根据算法说明,用代码来实现它试着跑一下看看。
抽签算法如下:
1、抽签计算方法步骤:
注:A:基数;B:翻转数;X:报名次数;Y:种子号,即起始中签号;Z:阶数;
(1)A=(抽签日的上一个工作日的深圳证券交易所深证成指“今收”指数×100)×(抽签日的上一个工作日的深圳证券交易所中小100指数“今收”指数×100)×10000;
注:可登录深圳证券交易所网站历史指数行情查询,详见下文附录。A为整数,不能有小数位。
(2)B=将基数A对应的数字倒序排列(如首位是0,则直接抹去);
(3)Y=B/X后所得的余数加1;
(4)Z=X/中签数量取整数(去掉小数点后的整数);
(5)最终全部中签的报名号,如下:
第一个中签号=Y;
第二个中签号=Y+Z;
第三个中签号=Y+Z*2;
第N个中签号=Y+Z*(N-1);
如果第N个中签号码>总报名次数,那么第N个中签号码=Y+Z*(N-1)-总报名次数。
2、举例说明
如某个预订活动,38674次报名,要抽中1500个中签的报名号:
(1)每个会员通过报名的先后顺序会得到1到38674的号码作为自己的抽签报名号,每个会员的报名号不同。
(2)按照抽签活动公布的抽签日的上一个工作日的深证证券交易所股票指数收盘行情中,深证板指、中小100收盘指数为抽签计算变量。
例如:2019年4月29日深圳证券交易所收盘行情:
深圳板指:9622.49 中小100:6013.23
(3)根据上述计算步骤
基数A为“5786224554270000”;
基准数反转数B为“724554226875”;
获得种子数/起始中签号Y为“8144”;
阶数:Z=38674/1500(取整数),即为25;
第1个中签号=8144;
第2个中签号=8144+25*1;
第3个中签号=8144+25*2;
以此类推,第1222个中签号=8144+25*(1222-1)
第1223个中签号=8144+25*(1223-1)=38694>38674,所以,第1223个中
签号=8144+25*(1223-1)-38674=20
以此类推,第1500个中签号=8144+25*(1500-1)-38674=6945
附链接: 深圳证券交易所-行情信息
直接上代码:
1 | public class ChouQianYuYue { |
代码执行结果:
1 | A = 5786224554270000 |
经验证,代码执行结果与算法预期结果一致。