2016年8月10日 星期三 晴

我不太理解上海牌照拍牌制度,我觉得这么贵的一张铁皮,政府如果真的想要控制数量的话,为何不像北京那样摇号?在我看来,拍牌只是政府想收一笔钱罢了,而这笔钱的去向是不透明的。所谓拍牌要靠网速、靠技术、靠运气,这都掩饰不了政府背后操纵价格的本质,最终只不过是按某个价格把额度给某少部分人罢了。

 12306,我也不理解为什么大家买票会这么难,极端情况下n个人抢着m张票,n远远大于m。还设置了规定某点开始抢票,秒杀,这不给服务器带来严重负担吗?

 上面两个问题,如果非要公平,也很简单,那就是像打新股那样摇号。我刚好写过打新模拟程序,中签结果也是自己模拟的,能控制好中签率随机摇号出来,这其实很简单。

牌照摇号比较简单,随机抽一次就可以了。火车票复杂一点,我的大概思路是:

  1. 需要实名认证的用户才能购买。— 现在12306已经做到了
  2. 每个用户限购1张同样车次同样时间的车牌。— 现在12306已经做到了
  3. 假设有这样类型的票:软卧(类型A,a张),硬卧(类型B,b张),硬座C张(类型C,c张);其他车次的类型可以类推,一等座、二等座等。 假设列车车次是T497,出发日期是20161001

签号格式:车次_出发日期_类型_人数_签号

(1)单个用户申购的时候,可以这样下单申购:比如申购软卧,得到签号是T497_20161001_A_1_********

(2)如果多个用户想组团也可以,有的人比如一家4口,那么他们也可以这样下单申购,都是要硬卧B的话,得到的签号是T497_20161001_4_B********,4个人是一签,要买到就都买到,要不就都不买到的这种。

(PS:如果接受有些人买到有些人没买到,可以按单个用户申购的方式去申购)

(3)申购时间:开车前 30 × 24小时 ~ 开车前8 × 24小时 签号公布时间:开车前7 × 24小时的时间 自由买票时间:如果申购还有余票的话(有时候申购不满,有时候有人退票),7×24小时到开车前2小时提供买票机会,跟现在的做法一样。

(4)摇号规则: 分成几个大组,每个大组组内随机摇号,凑完为止。比如硬卧的票总数是b张,如果抽中的签号分别是 T497_20161001_1_B********、T497_20161001_2_B********、T497_20161001_4_B********,如此类推,那么数量依次累加为1+2+4+…,当这个总数大于等于b的时候,抽票截止。

写段伪代码吧 [code] total = 0 qianhaoList = [‘T497_20161001_1_B********’,‘T497_20161001_4_B********’,] while(total < b) { qianhao = random.choice(qianhaoList)#在签号池里随机抽取一个签号

num = getnum(qianhao)#获取签号里的数量

if total + num > b: #到了最后了,可能有超过总票的可能性,要继续抽
    continue
print qianhao#打印中签号,然后各种中签处理逻辑
total += num

} [/code]

  1. 需要先支付现金才有摇号资格(资金沉淀也是有利息的)。 如果没中签则按原路径退回资金。 中签的退票要加重手续费(这又赚一把)。(防止有人每天都去申购,增加中签几率)

  2. 人流量这么大,在网站或者手机上搞点专车服务或者目的地餐饮服务或者旅游优惠业务,抢枪携程、滴滴、点评网等生意。

优点:不要搞那么多服务器了,不用应对人流高峰了 缺点:买票没有那么直观,之前买到就是买到了,现在不是。

我没想着从技术上如何如何去实现峰值如何用服务器缓解的问题,而是从机制的角度去实现,肯定是有优缺点的,还有待讨论完善。如果哪天12306使用了我的想法,我会很高兴。