QQ群看到的原python代码 + 自己实现的c++版本

微信红包服务器反编译的算法:红包分配算法代码实现发给大家,祝红包大丰收!

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
    #coding=gbk
import random
import sys
#print random.randint(0, 99)
#print "====", random.uniform(0, 0.99)
def calRandomValue(min, max, total, num):
print min, max, total, num
total = float(total)
num = int(num)
min = 0.01
if(num < 1):
return
if num == 1:
print "第%d个人拿到红包数为:%.2f" %(num, total)
return
>
i = 1
total_money = total
#rtotal = (total*100 - min*num*100)/100
while( i < num ):
max = total_money - min*(num- i)
k = int((num-i)/2)
if num -i <= 2:
k = num -i
max = max/k
monney = random.randint(int(min*100), int(max*100))
monney = float(monney)/100
total_money = total_money - monney
print "第%d个人拿到红包数为:%.2f, 余额为: %.2f" %(i, monney, total_money)
i += 1
>
print "第%d个人拿到红包数为:%.2f, 余额为: %.2f" %(i, total_money, 0.0)
if __name__ == "__main__":
min = sys.argv[1]
max = sys.argv[2]
total = sys.argv[3]
num = sys.argv[4]
calRandomValue(min, max, total, num)

python 2.py 0.01 10 20 30
Output:
0.01 10 20 30
第1个人拿到红包数为:1.34, 余额为: 18.66 第2个人拿到红包数为:1.06, 余额为: 17.60
第3个人拿到红包数为:1.08, 余额为: 16.52 第4个人拿到红包数为:0.98, 余额为: 15.54
第5个人拿到红包数为:0.88, 余额为: 14.66 第6个人拿到红包数为:0.48, 余额为: 14.18
第7个人拿到红包数为:0.26, 余额为: 13.92 第8个人拿到红包数为:0.90, 余额为: 13.02
第9个人拿到红包数为:0.12, 余额为: 12.90 第10个人拿到红包数为:0.41, 余额为: 12.49
第11个人拿到红包数为:0.43, 余额为: 12.06 第12个人拿到红包数为:0.63, 余额为: 11.43
第13个人拿到红包数为:0.36, 余额为: 11.07 第14个人拿到红包数为:0.25, 余额为: 10.82
第15个人拿到红包数为:1.38, 余额为: 9.44 第16个人拿到红包数为:0.17, 余额为: 9.27
第17个人拿到红包数为:0.79, 余额为: 8.48 第18个人拿到红包数为:0.52, 余额为: 7.96
第19个人拿到红包数为:0.44, 余额为: 7.52 第20个人拿到红包数为:1.15, 余额为: 6.37
第21个人拿到红包数为:0.13, 余额为: 6.24 第22个人拿到红包数为:0.76, 余额为: 5.48
第23个人拿到红包数为:1.32, 余额为: 4.16 第24个人拿到红包数为:0.80, 余额为: 3.36
第25个人拿到红包数为:0.16, 余额为: 3.20 第26个人拿到红包数为:0.27, 余额为: 2.93
第27个人拿到红包数为:1.82, 余额为: 1.11 第28个人拿到红包数为:0.45, 余额为: 0.66
第29个人拿到红包数为:0.27, 余额为: 0.39 第30个人拿到红包数为:0.39, 余额为: 0.00

然后是自己用c++重新实现的算法代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
#include <iostream>
#include <iomanip>
#include <cstdlib>
#include <ctime>

int random(int min,int max);
int random(int max);
void calRandomValue(double min,double max,double total,int num);

int main(int argc, char *const* argv)
{
using namespace std;
if (argc == 4){
double min = sscanf("%lf",argv[1]);
double max = sscanf("%lf",argv[2]);
double total = sscanf("%lf",argv[3]);
int num = sscanf("%d",argv[4]);
calRandomValue(min,max,total,num);
}else{
calRandomValue(0.01,10,20,30); //for debug
}
return 0;
}
void calRandomValue(double min,double max,double total,int num){
using namespace std;
cout<<setprecision(2) << setiosflags(ios::fixed);
if (num<1) return ;
}
if (num==1){
cout<<"第"<<1<<"个人拿到红包:"<<total<<endl;
return ;
}
double total_money = total;
for (int i=1;i<num;++i)
{
max = total_money - min*(num-i);
int k = static_cast<int>((num-i/2));
if (num-i<=2){
k = num-i;
}
max = max / k;
double money = random(static_cast<int>(min*100),static_cast<int>(max*100));
money = money / 100;
total_money = total_money - money;
cout<<"第"<<i<<"个人拿到红包:"<<money<<",余额为"<<total_money<<endl;
}
cout<<"第"<<num<<"个人拿到红包:"<<total_money<<",余额为"<<0.00<<endl;
}

int random(int min,int max)
{
static int last = 100;
srand( static_cast<unsigned>(time(NULL)) +last );
return last= rand() % (max-min+1)+min;
}

int random(int max)
{
static int last = 100;
srand( static_cast<unsigned>(time(NULL)) +last );
return last= rand() % (max+1);
}

第1个人拿到红包:0.47,余额为19.53 第2个人拿到红包:0.63,余额为18.90 第3个人拿到红包:0.09,余额为18.81
第4个人拿到红包:0.05,余额为18.76 第5个人拿到红包:0.58,余额为18.18 第6个人拿到红包:0.33,余额为17.85
第7个人拿到红包:0.23,余额为17.62 第8个人拿到红包:0.51,余额为17.11 第9个人拿到红包:0.17,余额为16.94
第10个人拿到红包:0.31,余额为16.63 第11个人拿到红包:0.17,余额为16.46
第12个人拿到红包:0.36,余额为16.10 第13个人拿到红包:0.27,余额为15.83
第14个人拿到红包:0.16,余额为15.67 第15个人拿到红包:0.33,余额为15.34
第16个人拿到红包:0.59,余额为14.75 第17个人拿到红包:0.36,余额为14.39
第18个人拿到红包:0.31,余额为14.08 第19个人拿到红包:0.11,余额为13.97
第20个人拿到红包:0.57,余额为13.40 第21个人拿到红包:0.30,余额为13.10
第22个人拿到红包:0.26,余额为12.84 第23个人拿到红包:0.66,余额为12.18
第24个人拿到红包:0.62,余额为11.56 第25个人拿到红包:0.34,余额为11.22
第26个人拿到红包:0.27,余额为10.95 第27个人拿到红包:0.20,余额为10.75 第28个人拿到红包:3.81,余额为6.94
第29个人拿到红包:1.31,余额为5.63 第30个人拿到红包:5.63,余额为0.00