[Go实战]写一个简单的概率算法(抽奖)

package main

import (
	"fmt"
	"math/rand"
)

func main() {
	//100万次算法运行
	for a := 0; a < 1000000; a++ {
		fmt.Println(Algorithm(a))
	}
}

func Algorithm(a int) string {
	start := 0
	var end int
	//probabilities,一共几个概率事件,另外各自概率是多少 必须相加=10000
	probabilities := []int{300, 1000, 2400, 1600, 3000, 1200, 500}
	rand := rand.Intn(10000) //0-10000的随机数共10000个数
	for _, probability := range probabilities {
		end += probability
		if start <= rand && end > rand {
			return fmt.Sprintf("第%d次,开始:%d,随机数:%d,结束:%d", a, start, rand, end)
		}
		start = end
	}
	return "概率错误"
}

结果如下:

第二种实现:

package main

import (
	"fmt"
	"math/rand"
)

type PrizeCount int

const (
	PrizeCountWithout  PrizeCount = iota // 没有奖品数量
	PrizeCountLeft                       // 还有奖品数量
	PrizeCountInfinite                   // 无限奖品数量
)

type PrizeType int

const (
	PrizeTypeEmpty  PrizeType = iota // 没有奖品
	PrizeTypeCoupon                  // 优惠券奖品
	PrizeTypeGoods                   // 实物奖品
	PrizeTypeCoin                    // 金币奖品
	PrizeTypeMoney                   // 金钱奖品
)

type Prize struct {
	PrizeType  PrizeType  `json:"prize_type"`  // 奖品类型
	PrizeCount PrizeCount `json:"prize_count"` // 奖品数量
}

func main() {
	prize := newLottery()
	for i := 0; i < 10; i++ {
		item := Lottery(prize)
		fmt.Println("抽奖结果:", item)
	}
}

func newLottery() []*Prize {
	empty := &Prize{
		PrizeType:  PrizeTypeEmpty,
		PrizeCount: PrizeCountInfinite,
	}

	coupon := &Prize{
		PrizeType:  PrizeTypeCoupon,
		PrizeCount: PrizeCountInfinite,
	}

	goods := &Prize{
		PrizeType:  PrizeTypeGoods,
		PrizeCount: PrizeCountLeft,
	}

	coin := &Prize{
		PrizeType:  PrizeTypeCoin,
		PrizeCount: PrizeCountInfinite,
	}

	money := &Prize{
		PrizeType:  PrizeTypeMoney,
		PrizeCount: PrizeCountWithout,
	}

	prize := []*Prize{empty, coupon, goods, coin, money}
	var result []*Prize
	for _, item := range prize {
		if item.PrizeCount == PrizeCountWithout {
			continue
		}
		result = append(result, item)
	}
	return result
}

func Lottery(prize []*Prize) *Prize {
	prizeLen := len(prize)
	if prizeLen == 0 {
		return nil
	}
	randPrize := rand.Intn(prizeLen - 1)
	fmt.Println("随机数:", randPrize)
	return prize[randPrize]
}

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值