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
}

以上仅供参考,具体实现业务逻辑则需要根据实际情况编码

Logo

开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!

更多推荐