微信搶紅包的演算法實現(C++)
阿新 • • 發佈:2018-12-22
目前只能實現對於整數的錢數的紅包的實現,經過隨機數從而實現隨機人搶紅包的演算法
/* vs 2013 wk */ #include<iostream> #include<time.h> #include<math.h> #include<stdlib.h> using namespace std; //min 預設最小金額 1=0.01元 //max 預設最大金額 20000 = 200 元 //total 總錢數 //num 總人數 long long CalcRandomValue(long long min, long long max, long long total, long long num) { if (num == 1) { return total; } //跟新隨機種子 srand((unsigned int)time(NULL)); //鎖定本次隨機範圍 long long low = (total - (num - 1)*max) < min ? min : (total - (num - 1)*max); long long high = (total - (num - 1)*min) > max ? max : (total - (num - 1)*min); long long ave = (total / num) > 1 ? (total / num) : 1; //調整上限 if (high > 2 * ave) { high = 2 * ave; } //生成隨機值 long long ram = rand() % high; //防止溢位 if (ram < low) ram = low; if (ram > high) ram = high; return abs(ram); } long long qianghongbao(long long total,long long num ) { if (total > 0) { if (num == 1) { printf("發紅包金額%ld\n", total); } total *= 100; long long low = 1; long long max = 20000; printf("紅包總金額 %ld元\n", total/100); printf("搶紅包總人數 %ld\n", num); long long ret = 0; int i = 1; float big = 0.0; int person = 0; while (num > 0) { ret = CalcRandomValue(low, max, total, num); float ram = ret / 100.0; printf("第%i個人搶到了%lf元\n", i,ram); if (ram > big) { big = ram; person = i; } total -= ret; --num; ++i; } printf("第%d個人搶了%f元,手氣最佳\n", person, big); } return -1; } int main() { qianghongbao(11, 10); system("pause"); return 0; }