1.獎品抽獎
以前做抽獎,有那種抽獎的算法,比如大轉(zhuǎn)盤,有手機,積分,券等。
算法原理 + 完整示例
一、算法原理
這種抽獎算法叫區(qū)間概率映射法,核心思路:
把所有獎品的中獎概率,按統(tǒng)一精度放大成整數(shù)權(quán)重,保證總權(quán)重對應(yīng) 100% 概率。
根據(jù)權(quán)重給每個獎品劃分一段連續(xù)、不重疊的數(shù)字區(qū)間。
抽獎時隨機生成一個數(shù)字,該數(shù)字落在哪個獎品的區(qū)間,就抽中對應(yīng)獎品。
權(quán)重越大、區(qū)間越長,中獎概率越高,公平且精準(zhǔn)。
二、完整示例
設(shè)定 6 種獎品,總概率嚴(yán)格為 100%,統(tǒng)一乘以 1000 轉(zhuǎn)為權(quán)重:
表格
獎品概率與區(qū)間配置表
| 獎品 | 中獎概率 | 對應(yīng)權(quán)重 | 分配數(shù)字區(qū)間 |
|---|---|---|---|
| 手機 | 0.9% | 9 | 1 ~ 9 |
| 50 元優(yōu)惠券 | 5% | 50 | 10 ~ 50 |
| 10 元優(yōu)惠券 | 20% | 200 | 51 ~ 200 |
| 100 積分 | 10% | 100 | 20~ 359 |
| 20 積分 | 24.1% | 241 | 360 ~ 600 |
| 謝謝參與 | 40% | 400 | 601 ~ 1000 |
抽獎結(jié)果示例
抽獎時隨機生成 1~1000 范圍內(nèi)的整數(shù),數(shù)字落于對應(yīng)區(qū)間即中該獎品:
隨機數(shù) 3 → 落在 1~9 → 中手機
隨機數(shù) 30 → 落在 10~59 → 中 50 元優(yōu)惠券
隨機數(shù) 120 → 落在 60~259 → 中 10 元優(yōu)惠券
隨機數(shù) 300 → 落在 260~359 → 中 100 積分
隨機數(shù) 500 → 落在 360~600 → 中 20 積分
隨機數(shù) 800 → 落在 601~1000 → 謝謝參與
可以將1 ~ 9,10 ~ 59,60 ~ 259, ... ,一直到601 ~ 1000,每個區(qū)間作為一個數(shù)組元素,統(tǒng)一放到一個數(shù)組里面,抽獎的隨機數(shù)就遍歷這個數(shù)組,比如是90,那就落在數(shù)組60~259這個元素,就對應(yīng)10元優(yōu)惠券。
2.紅包
這里看到別人的帖子也是有3種挺好的實現(xiàn)方式:
隨機分配法
將金額轉(zhuǎn)分避免浮點誤差,按順序為前 n-1 人隨機分配,隨機范圍為 [1, 剩余金額 / 總金額 90% 最小值],且保證分配后剩余金額≥剩余人數(shù)(每人至少 1 分);最后 1 人直接獲得剩余金額。缺點:先搶的人隨機范圍大,更容易搶到大額,分配不均。二倍均值法 --- 微信的手氣紅包用的就是這種
金額轉(zhuǎn)分后,按順序為前 n-1 人分配,核心是每次隨機范圍為 [1, 剩余金額 / 剩余人數(shù) ×2 -1](分),保證每次隨機金額的平均值相等;最后 1 人得剩余金額。特點:分配更均衡,紅包金額與搶的先后順序無關(guān),避免兩極分化。
https://cloud.tencent.com/developer/article/2599348?policyId=1004
- 線段切割法
將總金額(分)看作線段,n 人搶則隨機生成 n-1 個不重復(fù)切割點(范圍 [1, 總金額]),切割點排序后,相鄰點的差值 / 首個點值 / 總金額減最后一個點值,即為每人的金額,最后轉(zhuǎn)元。特點:所有人生成金額的概率均等,手氣最佳的金額可能比二倍均值法更高,無先后順序差異。