func SimpleRand(count, amount int64) int64 {
// 当红包剩余一个
if count == 1 {
return amount
}
// 计算最大可调度金额
max := amount - min*count
rand.Seed(time.Now().UnixNano())
x := rand.Int63n(max) + min
return x
}func main() {
count, amount := int64(10), int64(100)
for i := int64(0); i < count; i++ {
x := algo.SimpleRand(count, amount*100)
fmt.Print(float64(x)/float64(100), ", ")
}
fmt.Println()
}各位小伙伴,已设置 rand 的种子,最后输出的红包金额相同。
输出:32.74, 54.66, 54.66, 54.66, 54.66, 54.66, 54.66, 54.66, 54.66, 54.66,
如果设置这样
for i := int64(0); i < count; i++ {
time.Sleep(10)
x := algo.SimpleRand(count, amount*100)
fmt.Print(float64(x)/float64(100), ", ")
}红包金额才能跟老师的一样。
这是程序运行太快,时间差太小导致的吗?
@ PumkinPie sleep的方法不可取啊,rand.Seed是为了改变初始随机种子数,反正程序重新启动时的随机序列一样的,只要保证每次重启后的初始随机种子数不一样就行。
func test2(){
amount := int64(100)
initialAmount := amount * 100
for count := int64(10); count >= 1; count-- {
randomAmount := algo.SimpleRandom(count, initialAmount)
initialAmount -= randomAmount // 初始金额减去已经分配的金额
fmt.Printf("第%d个红包的金额是%f\n", count, float64(randomAmount) / float64(100))
}
}使用这个测试用例,可以保证每个红包的总和 等于 总金额。

发现总金额不对,老师能帮忙看下吗?1972,2370,5531,9900,5433,857,5400,7428,7838,4710,all: 51439
func main() {
count, amount := int64(10), int64(100)
sum := int64(0)
for i := int64(0); i < count; i++ {
x := algo.SimpleRand(count, amount*100)
fmt.Print(x,",")
//fmt.Print(float64(x)/float64(100), ",")
sum +=x
}
fmt.Println("all:", sum)
fmt.Println()
}如果不放在main中,可以随机数种子增加一个再加上一个随机就好啦

已解决:
程序运行的太快,UnixNano 生成的时间都是一样的,从而导致 生成 rand 数值也是一样的。

解决办法:
1,可以在 seed 设置完成以后 time.Sleep(1),情况会好很多。


2,在 main 函数里 设置
rand.Seed(time.Now().UnixNano())
让它只运行一次即可。