PumpkinPie_
2019-03-17 22:38
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())
让它只运行一次即可。
3小时极简春节抢红包之Go的实战
12078 学习 · 31 问题
相似问题