开始
事情是这样的,女朋友最近迷上了拼多多砍价,总是让我帮他砍一刀,大到手机平板平衡车,小到口红香水和大鹅(押X2)还要我邀请其他人帮忙一起砍价,我内心是极不情愿的,但是怎么给她解释这事儿不靠谱呢?为了讲清楚拼夕夕砍一刀的原理,于是我熬夜写了个拼夕夕砍价页面,模拟出了邀请好友帮忙砍价的过程。
先来看下完成的页面
经过
一共有5个页面,第一个页面是商品的砍价进度页面,在这里通过一个进度条显示砍价进度,下面显示的是砍价记录,每一次有人砍一刀,这里就会多一条记录,显示是谁帮你砍掉多少。在进度条下面有个邀请好友的按钮,点击这个按钮就可以把当前页面分享给好友了。由于是H5页面,我并没有调用分享SDK,而是点击按钮后,自动复制分享链接到粘贴板,你可以通过任何方式(微信,QQ等)分享给七大姑,八大姨,其实拼夕夕也不能直接分享链接到微信,而是分享一段口令。
然后打开微信,把链接分享给某人:
二狗点击链接,就打开了第二个页面:
在这个页面,二狗可以看到你让他帮你砍保10洁以及砍价进度,作为两肋插刀的好基友,二狗当然没有二话,点击砍价按钮,接着出现第三个页面(其实拼夕夕里是没有这个页面的,为了效果我故意添加的)
这个页面会有砍价的动画和音效,只为让你砍的更爽。随后出现第四个页面:
二狗在一顿操作之后,终于帮你砍掉0.03元
但是价值123的保10洁还差0.62就可以免费开回家了,我不能放弃,于是我又邀请了山鸡、彪子、永强、二丫、老根儿等一众好友的不屑努力下,在晚上0点之前,砍价成功了:
这就是整个砍价的流程。但是当我们观察砍价记录的时候会发现,随着砍掉的金额越多,剩余的金额越少,每次能看下的金额也越来越少,但并不绝对,偶尔有几个人能砍出相对较高的金额,但是整体是越来越低的趋势:
这是什么原理呢?每次砍价看多少完全是随机数吗?
GC
其实,对也不对,每次能砍多少和概率相关。
如果剩余金额为x,每次能砍掉的金额为x*y,那么y值的大小就决定了每次能砍多少。我们做以下规定:
- y的取值范围为0.1~0.9
- 0.1出现的概率为90%,0.2出现的概率减半,也就是45%,依次类推,最后0.9出现的概率为0.3515625%
- 每次砍价最小值为0.01
- 砍价时间限制在24小时之内
- 每个用户只能砍价一次
- 当在24小时之内,剩余金额为0时,砍价成功
条件清楚了,就可以实现砍价算法了,这里我们不考虑时间和是否是同一个用户判定,只计算每次砍价的金额。
首先定义y值,默认值为0.1,然后生成随机数,判断随机数的大小来计算概率,我们知道Math.random可以生成01的随机数,那么表示某一个概率呢?比如10%这个概率如何表示呢?我们默认随机数是平均的出现在01之间的,那么这个数小于0.1的概率是多少呢?对,是10%,或者说大于90%的概率也是10%,甚至随机数出现在任何一个0.1区间的概率都是10%,也就是大于0.4并且小于0.5的概率也是0.1。
ok,那10%的概率能表示出来了,90%的概率呢? 随机数r < 0.9 或者 r > 0.1的概率都是90%,这样,我们就可以表示任何一个概率了。
如以下代码所示,0.1出现的概率为90%,表示为r < 0.9, 0.2 出现的概率减半,为45%,表示为 r < 0.45, 0.3 出现的概率再次减半,表示为r < 0.225,一次类推,最后0.9出现的概率为0.3515625%,表示为r < 0.003515625。
// y默认值为0.1
let y = 0.1;
// 随机数r,用来计算概率
let r = Math.random()
switch (true) {
case r < 0.003515625: y = 0.9;break;
case r < 0.00703125: y = 0.8;break;
case r < 0.0140625: y = 0.7;break;
case r < 0.028125: y = 0.6;break;
case r < 0.05625: y = 0.5;break;
case r < 0.1125: y = 0.4;break;
case r < 0.225: y = 0.3;break;
case r < 0.45: y = 0.2;break; //r为0~1之间的随机数,小于0.45的概率就是45%
case r < 0.9: y = 0.1;break; //r为0~1之间的随机数,小于0.9的概率就是90%
default: y = 0.1;
}
// 系数,通过这个值可以进一步调整每次砍价金额
const ratio = 0.5;
// 总价减去已经砍掉的价格等于剩余价格
let kp = (goods.total - goods.already) * ratio * y
// 设定砍价最小值为0.01
kp = kp < 0.01 ? 0.01 : kp;
求得y 之后,使用剩余价格乘以y即可得每次砍价金额,但为了增加砍价难度,我有增加了一个系数ratio,这是一个常量,通过设置这个值的大小可以进一步控制砍价的难度,比如这里我设置为0.5,使得每次砍价金额在之前的基础上再次减半,也就使得砍价次数增加一倍,你需要分享给更多的好友才能砍价成功。
结果
所以看到了吧,你辛辛苦苦砍一天,能否成功的关键只在拼夕夕后台的一个数字。
熬了一夜,终于把代码写完了,看着完成的demo,我以完全没有了困意,只等着女友醒来讲给她听。
完
以上代码可以在微信搜索H5talks回复pdd获得
【微信公号:H5开讲啦】