? ? ? ?一般的抽獎管理功能被盈,基本是在一個獎池中放一堆獎品貌夕,分別給它們設(shè)置不同的數(shù)量和概率炸枣,在獎品沒有發(fā)完的情況下虏等,概率高的被抽中的幾率就大,反之則低适肠,獎品被抽完后就不能再被抽中霍衫,另外,概率為0的不能被抽中侯养,概率為100則一定要被抽中敦跌。
? ? ? ?實現(xiàn)抽獎的算法很多。比較常見的抽獎算法有三種:
? ? ? ?第一種:逢“幾”中獎,即通過預(yù)估抽獎人數(shù)和獎品數(shù)來判斷柠傍,“幾”=(抽獎人數(shù)/獎品數(shù))*N麸俘。這是一種最簡單抽獎算法,適合抽獎人數(shù)眾多惧笛,而且互相無聯(lián)系的情況从媚。如今大為流行的微博轉(zhuǎn)發(fā)得獎就常常使用這種算法,即根據(jù)轉(zhuǎn)發(fā)次數(shù)來決定獎品歸屬患整,透明而且具有激勵性拜效。這種算法的優(yōu)點是非常簡單,很容易實現(xiàn)各谚,缺點是當(dāng)可能產(chǎn)生無人中獎和很多人中獎的情況紧憾。
? ? ? ?第二種:概率抽獎。所謂概率抽獎是最容易想到的抽獎算法了昌渤,這個概率可以是一成不變的赴穗,也可以是一直在變化調(diào)整的,最難的是采用多大的概率膀息,何種情況下采用何種概率般眉。例如:把設(shè)定的中獎概率從小到大排序(0.1、0.15履婉、0.25煤篙、0.5)斟览,劃分區(qū)間([0毁腿,0.1]、(0.1苛茂,0.15]已烤、(0.15,0.25]妓羊、(0.25胯究,0.5]),每次抽獎時代碼自動生成一個隨機(jī)數(shù)躁绸,當(dāng)隨機(jī)數(shù)在某個區(qū)間時裕循,就抽中某個獎品。此種算法實時性強(qiáng)净刮,但計算機(jī)產(chǎn)生的隨機(jī)數(shù)是一個偽隨機(jī)數(shù)剥哑,這就意味著,隨機(jī)數(shù)可能會連續(xù)相同淹父,即同一個用戶可能會連續(xù)抽中某個獎品株婴。
? ? ? ? 第三種:依賴不可控的物理隨機(jī)數(shù)。利用各種不可控的數(shù)據(jù)暑认,根據(jù)算法困介,得到一組數(shù)字大审,通過某種規(guī)則,來得出中獎則的號碼座哩,比如體育彩票徒扶、大樂透之類的,不可控的數(shù)據(jù)可能是上證指數(shù)......此種算法絕對公平根穷、絕對透明酷愧,在現(xiàn)如今也比較流行,但是這種算法的唯一的缺點是無法實時抽獎缠诅。
? ? ? ?以下主要介紹通過第二種抽獎概率算法實現(xiàn)的抽獎程序核心部分的測試:中獎概率的校對溶浴;獎品不足,用戶并發(fā)抽獎的情況管引。
一:程序中獎概率的準(zhǔn)確性校對
? ? ? ?概率的準(zhǔn)確性校對士败,需要在獎品數(shù)量無限充足的情況下測試。思路如下:先設(shè)定抽獎概率褥伴,模擬大量抽獎數(shù)據(jù)谅将,算出真實的抽獎概率,再來比對設(shè)定的和真實的抽獎概率之間的差距了重慢,如果不超過 正負(fù)1%饥臂,那么程序概率是正確的。具體操作方法如下:
1.在后臺管理系統(tǒng)中設(shè)置相應(yīng)抽獎活動各獎品的抽獎概率似踱,并設(shè)定每個用戶的抽獎概率次數(shù)足夠大
2.用jmeter工具模擬大量用戶進(jìn)行抽獎
a.獲取用戶登陸信息
? 因用戶抽獎是在登陸狀態(tài)下進(jìn)行的隅熙,所以在jmeter中需要保留用戶的登陸狀態(tài)
? b.用戶抽獎
設(shè)定并發(fā)抽獎的用戶數(shù)量,訪問抽獎接口 http://XX/game-mobile/intf/h5//turnTable/luckDraw?tableId=&ignoreCsrfToken=true并監(jiān)控多用戶并發(fā)狀態(tài)下核芽,確保抽獎錯誤率為0%
3.在mogodb中查詢當(dāng)天抽獎總次數(shù)囚戚,單個獎品被抽中的次數(shù),計算實際中獎概率
a.查詢數(shù)據(jù)并記錄在excel中
db.turntable_user_luckdraw.find({ "prizeType": "entity" }).count()
db.turntable_user_luckdraw.find({ "prizeType": "phone", "prizeValue": 10 ?}).count()
db.turntable_user_luckdraw.find({ "prizeType": "goldkey", "prizeNum": 1 }).count
b.計算實際中獎概率
實際中獎概率=中獎次數(shù)/抽獎總次數(shù)
c.保證設(shè)置的抽獎概率不變化轧简,在jmeter中更改抽獎的用戶數(shù)獲取多組用戶中獎概率數(shù)據(jù)
并計算出單個獎品中獎的期望值和偏差值驰坊。
4.小結(jié)
比較 設(shè)置的中獎概率和期望值的偏差 值,如若結(jié)果相差在正負(fù)1%的范圍之內(nèi)哮独,說明結(jié)果是沒問題的拳芙。反之在排除其他人為操縱故障等因素之后,說明抽獎程序可能存在bug
注:
(1)想要結(jié)果更具有說服力皮璧,可以更改設(shè)置的中獎概率舟扎,再次模擬大量用戶抽獎,得出更多數(shù)據(jù)
(2) 后臺設(shè)定的單個獎品的數(shù)量必須充足恶导,不能出現(xiàn)數(shù)量為0的情況浆竭,否則數(shù)據(jù)會有很大偏差
(3) 想要確保jmeter中多用戶并發(fā)結(jié)果出錯率為0%,可以降低并發(fā)用戶總數(shù),延長并發(fā)時間
二:獎品數(shù)量有限邦泄,獎品派發(fā)情況測試
測試獎品數(shù)量有限删窒,獎品派發(fā)情況時,需要把獎品設(shè)定成一個比較小的數(shù)顺囊,抽獎人數(shù)要大于獎品數(shù)肌索。比如設(shè)定某個獎獎品數(shù)量20個,但是抽獎人數(shù)有200個特碳,且這200人同時抽獎诚亚,查看中獎情況。
具體操作如下:
1.在后臺設(shè)置獎品一數(shù)量為:20午乓,其他獎品數(shù)量不做限制站宗。
2.使用jmeter模擬200個用戶抽獎。
3.查看抽獎結(jié)果益愈。
若有超過20人獲得該獎品梢灭,則程序存在bug。
抽獎是一個比較復(fù)雜的過程蒸其,以上只是針對抽獎核心模塊做了簡單介紹敏释,在實際測試中,當(dāng)然還需要考慮到安全性和性能問題摸袁。