为了账号安全,请及时绑定邮箱和手机立即绑定

已设置 rand 的种子,但输出红包金额相同

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), ", ")
}

红包金额才能跟老师的一样。

这是程序运行太快,时间差太小导致的吗?

正在回答

6 回答

@ PumkinPie sleep的方法不可取啊,rand.Seed是为了改变初始随机种子数,反正程序重新启动时的随机序列一样的,只要保证每次重启后的初始随机种子数不一样就行。

0 回复 有任何疑惑可以回复我~
#1

PumpkinPie_ 提问者

好,谢谢老师
2019-03-20 回复 有任何疑惑可以回复我~
#2

lili001 回复 PumpkinPie_ 提问者

红包的总金额不对吧,早就超过100了
2019-07-31 回复 有任何疑惑可以回复我~
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))
   }
}

使用这个测试用例,可以保证每个红包的总和 等于 总金额。

http://img1.sycdn.imooc.com//5dfb82fd0001513c04610361.jpg


0 回复 有任何疑惑可以回复我~

发现总金额不对,老师能帮忙看下吗?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()
}


0 回复 有任何疑惑可以回复我~
#1

卡卡小狮子

可以参考下我的测试用例
2019-12-19 回复 有任何疑惑可以回复我~

如果不放在main中,可以随机数种子增加一个再加上一个随机就好啦

https://img1.sycdn.imooc.com//5d010f5600015b8d07060564.jpg

0 回复 有任何疑惑可以回复我~

已解决:

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

https://img1.sycdn.imooc.com//5c8f0c4800012bc702710083.jpg

解决办法:

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

https://img1.sycdn.imooc.com//5c8f0b5200017e9102240381.jpg

https://img1.sycdn.imooc.com//5c8f0b5200010e8b06980791.jpg

2,在 main 函数里 设置 

rand.Seed(time.Now().UnixNano())

让它只运行一次即可。

0 回复 有任何疑惑可以回复我~

举报

0/150
提交
取消

已设置 rand 的种子,但输出红包金额相同

我要回答 关注问题
意见反馈 帮助中心 APP下载
官方微信