【剑思庭专栏】PLC分发微信红包如何编程?

微信通过春晚“摇一摇”互动、微信红包、摇礼券等丰富的形式陪伴全国人民度过了一个欢乐的羊年春节。数据显示,羊年春晚微信摇一摇互动总次数超过110亿次,央视春晚摇红包创造了全民欢乐互动的历史,让“看春晚”、“抢红包”、“摇一摇”成了2015亿万中国家庭的新年关键词。

而微信红包也成为了今年春节最受欢迎的祝福方式,“有微信红包才是过新年”由此成为更多人的心声。除夕至初五(共六日),微信红包收发总量为32.7亿次,其中除夕当日收发总数达到10.1亿次,创下了历史新高。

我也突发奇想,想通过PLC给控友微信群发红包!

我设定红包总额为Q元,支持n个人随机领取我按照自己的逻辑尝试了下,这个算法需要满足以下几点要求

1、每个人都要能够领取到红包;

2、每个人领取到的红包金额总和=总金额;

3、每个人领取到的红包金额不等,但也不能差的太离谱,不然就没趣味

我的思路其实用一句话就可以概括:生成n(n是总人数)个(0,1]之间的随机数,然后将其求和被Q(Q是总钱数)除得到一个比例C,用C乘以所有数,这样就得到了最终结果。

这个算法很多人都会想到,但是被大家抛弃的原因应该在于随机性太大(容易造成红包分化太严重)。那么我想到的修正方案:生成随机数时不要采用平均分布的随机数,而用正态分布的随机数。可是系统提供的随机数算法基本都是基于平均分布的,那现在提供一个平均分布映射到正态分布的算法就可以了。

其实这个算法很常见,假设生成的平均分布数是x,正态分布所求值是y,正太分布表达式是f(y),那么f(y)求积分记为F(y),根据这样一个式子F(y) = x,求出F(y)的反函数就是所需要的映射函数。这个看起来很复杂,其实求出一个式子后代码写起来很简单。由于采用梯形图来写这个算法,估计您要看上几十页,所以采用C语言实现这个代码,所以这个算法只需要两个function就可以实现:

double generateRandomNumber(){

//generate random number based on normal distribution

}

 

void process(double totalMoney, int personNum){

double[personNum] results;

for (int i=0; i < personNum; i++){

results[i] = generateRandomNumber();

}

double ratio = totoalMoney/sum(results);

for (int i=0; i < personNum; i++){

results[i] = result[i] * ratio;

}

}

为了实践这个想法,我特意在“剑指工控——微社区”的会员中开辟了一个专门发红包的程序讨论群组,欢迎大家加入微社区一起讨论该PLC发红包程序的可行性。(剑指工控微信中直接回复2,跳转至社区!)