上午看到基友分享的微信紅包算法的文章,代碼很短,春節(jié)期間紅包太火了,看完就也想實(shí)現(xiàn)下玩玩,原代碼是JAVA的,沒(méi)接觸過(guò)JAVA,所以看懂后改成了MATLAB的。
原文鏈接:微信紅包隨機(jī)算法初探?,?作者:陳鵬。
所寫(xiě)MATLAB代碼如下:
% -----------------------------------
?%Test for WeChat MoneyPackageAlgrithm
?% Email:xiaolongjee@mail.nwpu.edu.cn
?% 2016.02.13 - 17:32;
% -----------------------------------
close all;
clc;
clear all;
global leftMoneyPackage
MaxTestTimes = 12; % Set as 4*x for display;
row = 4;
col = MaxTestTimes / row;
figure;
for times = 1:MaxTestTimes
? ? leftMoneyPackage.peoples = 35;
? ? leftMoneyPackage.leftmoney = 0.35;
? ? n = leftMoneyPackage.peoples;
? ? cache = zeros(n,1);
? ? for i = 1:n
? ? ? ? cache(i) = getRandomMoney();
? ? end
? ? subplot(col, row,times);
? ? bar(cache, 'r');
end
function money = getRandomMoney()
? ? global leftMoneyPackage
? ? if (leftMoneyPackage.peoples == 1)
? ? ? ? leftMoneyPackage.peoples = 0;
? ? ? ? money =? round(leftMoneyPackage.leftmoney * 100) / 100;
? ? else
? ? ? ? minGet = 0.01;
? ? ? ? maxGet = leftMoneyPackage.leftmoney /? ? leftMoneyPackage.peoples * 2;
? ? ? ? r = random('Uniform', 0, 1);
? ? ? ? money = r * maxGet;
? ? ? ? if(money < minGet)
? ? ? ? ? ? money = minGet;
? ? ? ? end
? ? ? ? money = floor(money * 100) / 100;
? ? ? ? leftMoneyPackage.peoples =? ? leftMoneyPackage.peoples - 1;
? ? ? ? leftMoneyPackage.leftmoney =? ? leftMoneyPackage.leftmoney - money;
? ? end
? ? end
寫(xiě)完做了幾組測(cè)試(每組重復(fù)12次):
1.35個(gè)人瓜分0.35元,理論每人為最低值0.01,正確。
2.35個(gè)人瓜分0.36元,理論34人為最低值0.01,1人0.02,正確。
3. 35人瓜分50元,作為普通組。
最后建了個(gè)小群實(shí)際發(fā)紅包重復(fù)跑程序,數(shù)據(jù)基本能吻合,手氣最佳一般在均值2倍附近。
完畢,成就感滿(mǎn)滿(mǎn)。
想知道具原理及各種說(shuō)明的點(diǎn)擊文章開(kāi)頭鏈接。
北一? 2016.02.13
版權(quán)歸作者所有,轉(zhuǎn)載請(qǐng)注明作者、出處,其他任何形式的使用請(qǐng)聯(lián)系我。