golang实现简易抽奖算法参考
package mainimport ("crypto/rand""fmt""github.com/spf13/cast""math/big")func main() {gifts := []Gift{{Name:"mac",Prop:2,Type:1,Count: 1,}, {Name:"红米",Prop:3,Type:2,Count: 2,}, {Name:"U盘",Prop:
·
package main
import (
"crypto/rand"
"fmt"
"github.com/spf13/cast"
"math/big"
)
func main() {
gifts := []Gift{{
Name: "mac",
Prop: 2,
Type: 1,
Count: 1,
}, {
Name: "红米",
Prop: 3,
Type: 2,
Count: 2,
}, {
Name: "U盘",
Prop: 5,
Type: 3,
Count: 3,
}, {
Name: "阳光普照奖",
Prop: 10,
Type: 4,
Count: 4,
}, {
Name: "谢谢惠顾",
Prop: 80,
Type: 5,
Count: 0,
}}
for i := 0; i < 200; i++ {
result := GetResult(gifts)
if result.Type != 5 {
//抽奖完成后,这里需要扣减奖品数量
for i := 0; i < len(gifts); i++ {
if result.Type == gifts[i].Type {
gifts[i].Count = gifts[i].Count - 1
}
}
}
fmt.Println(result)
}
}
//抽奖规则
// 1、设置随机数,获取随机数,看这个随机数是否小于概率(整型),如果是的话,那需要判断奖品数量是否足够,如果是足够的话,那表示这个人抽中奖了
func GetResult(arr []Gift) Gift {
var leng = 0 //默认都是100即为100%
for i := 0; i < len(arr); i++ {
leng += arr[i].Prop
}
for i := 0; i < len(arr); i++ {
result, err := rand.Int(rand.Reader, big.NewInt(cast.ToInt64(leng)))
if err != nil {
fmt.Println(err.Error())
}
random_str := result.String()
random := cast.ToInt(random_str)
if random < arr[i].Prop {
if arr[i].Count > 0 {
return arr[i]
} else {
return Gift{
Name: "谢谢惠顾",
Prop: 0,
Type: 5,
Count: 0,
}
}
} else {
leng -= arr[i].Prop
}
}
return Gift{
Name: "谢谢惠顾",
Prop: 0,
Type: 5,
Count: 0,
}
}
type Gift struct {
//奖品名称
Name string
//概率
Prop int
//类型
Type int
//数量
Count int
}
以上仅供参考,具体实现业务逻辑则需要根据实际情况编码
开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!
更多推荐
已为社区贡献1条内容
所有评论(0)