【问题标题】:How to generate a fixed length random number in Go?如何在 Go 中生成一个固定长度的随机数?
【发布时间】:2016-03-15 02:27:47
【问题描述】:

在 Go 中生成固定长度随机数的最快和最简单的方法是什么?

假设要生成 8 位长数字,rand.Intn(100000000) 的问题是结果可能远小于 8 位,并且用前导零填充它对我来说似乎不是一个好的答案。

也就是说,我更关心随机性的质量,就其长度而言。所以我在想,对于这个特定的问题,以下是最快和最简单的方法吗?

99999999 - rand.Int63n(90000000)

即,我猜Int63n 可能比Intn 更适合我的情况。是真的,还是只是一厢情愿?关于全 8 位的随机性,两者是一样的,还是真的有一个比另一个好?

最后,还有什么比上面更好的方法吗?

更新:

请不要提供low + rand(hi-low) 作为答案,众所周知。它相当于我现在正在做的事情,它并没有回答我真正的问题,“关于完整 8 位数字的随机性,两者是否相同,或者真的有一个比另一个更好?"

如果没有人能回答这个问题,我会在两者之间绘制一个二维散点图并找出自己......

谢谢

【问题讨论】:

  • 您的用例是什么?对我来说,您似乎想要一个由 8 位数字组成的字符串,而不是一个数字本身?这个答案可能会有所帮助:stackoverflow.com/questions/22892120/…
  • @Ezra,这个问题实际上是受到那个问题的启发,尽管性能改进了几次迭代,但仍然无法摆脱那个循环。是的,我确实想要由 8 位数字组成的字符串,而不是数字本身。即使是十六进制数字也适合我。关键是,我上面的解决方案可以一次性完成,我相信这会比那里最快的解决方案快得多,这远非简单。
  • 用零填充没有什么问题:一个随机数如果填充后可能以一个或多个零开头,并且仍然是完全随机的。
  • @Volker,我个人的口味没有什么不想要的填充物。您可能喜欢00000023,甚至00000004 作为答案,但我个人不喜欢。我已经已经在 OP 中清楚地说明了这一点,所以我看不出你争论的重点——这一切都归结为个人品味,所以请不要强迫别人。跨度>
  • 如果我伤害了你的感情,请原谅。我只是不知道随机数更多的是品味问题而不是数学问题。对不起。

标签: random go numbers


【解决方案1】:

这是一个通用函数,用于生成范围内的数字

func rangeIn(low, hi int) int {
    return low + rand.Intn(hi-low)
}

在 Playground

上查看

在您的具体情况下,尝试生成 8 位数字,范围为 (10000000, 99999999)

【讨论】:

    【解决方案2】:

    这取决于您要使用的值范围。

    1. 如果您允许值范围 [0-99999999] 并填充零 ip 字符数 fmt.Sprintf("%08d",rand.Intn(100000000))。

    2. 如果你不想要填充,那么在 [10000000, 99999999] 范围内的哪个值,然后给它一个像 ranNumber := 10000000 + rand.Intn(90000000) 的基数`

    【讨论】:

      猜你喜欢
      • 2018-06-19
      • 2016-06-17
      • 2014-03-16
      • 2020-03-11
      • 1970-01-01
      • 1970-01-01
      • 2019-06-23
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多