课程
下载APP
源自:6-7 红包算法-简单随机算法

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

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

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

提问者:PumpkinPie_ 2019-03-17 22:38

5个回答

  • 枫荇
    2019-03-19 08:20
    已采纳

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

  • PumpkinPie_
    2019-03-18 11:11

    已解决:

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

    https://img4.mukewang.com/5c8f0c4800012bc702710083.jpg

    解决办法:

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

    https://img1.mukewang.com/5c8f0b5200017e9102240381.jpg

    https://img1.mukewang.com/5c8f0b5200010e8b06980791.jpg

    2,在 main 函数里 设置 

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

    让它只运行一次即可。

  • 寻找09之夏
    2019-06-12 22:44

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

    https://img3.mukewang.com/5d010f5600015b8d07060564.jpg

  • lili001
    2019-07-31 15:43

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


  • 卡卡小狮子
    2019-12-19 22:02

    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.mukewang.com/5dfb82fd0001513c04610361.jpg