如何在Go中生成可变长度随机数

如何在Go中生成可变长度随机数,go,random,cryptography,Go,Random,Cryptography,我试图在Go中生成一个长度可变的随机整数,但我总是得到填充总长度的数字。这是我的密码: package main import ( "fmt" "math/big" "crypto/rand" ) const ResultsPerPage = 30 var ( total = new(big.Int).SetBytes([]byte{ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,

我试图在Go中生成一个长度可变的随机整数,但我总是得到填充总长度的数字。这是我的密码:

package main

import (
    "fmt"
    "math/big"
    "crypto/rand"
)

const ResultsPerPage = 30

var (
        total = new(big.Int).SetBytes([]byte{
                0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFE,
                0xBA, 0xAE, 0xDC, 0xE6, 0xAF, 0x48, 0xA0, 0x3B, 0xBF, 0xD2, 0x5E, 0x8C, 0xD0, 0x36, 0x41, 0x40,
        })
        pages = new(big.Int).Div(total, big.NewInt(ResultsPerPage))
        random *big.Int
        err error
)

func main() {

fmt.Println(pages)
fmt.Println(randomString(pages))
}

func randomString(l *big.Int) string {
  random, err = rand.Int(rand.Reader, l)
  fmtrandom := fmt.Sprint(random)
  return string(fmtrandom)
}
输出

3859736307910539847452366166956263595094585475969163479420172104717272049811
3479662380009045046388212253547512051795238437604387552617121977169155584415
代码示例:


感谢您的帮助。多谢各位

如果我理解正确,您遇到的问题是,随机数似乎总是具有与最大允许值相同的位数,对吗?当我运行代码时,情况并非如此。这是我刚才观察到的一个输出:

3859736307910539847452366166956263595094585475969163479420172104717272049811
65719900872761032562423535702578352960653752260368991759410130265294153783
在操场上,我相信随机种子和时钟时间是固定的,所以你会反复看到相同的结果。但是在本地运行时,我看到了输出长度的预期变化

更新

您可能想知道为什么可以多次运行此代码,并观察到随机数的长度通常接近最大值的长度

一点数学解释了这一点。让我们想象一下,我们正在选择一个介于0和999之间的数字。该范围内有多少个数字:

  • 三位数?900(100-999)
  • 两位数?90(10-99)
  • 1位数?10(0-9)

  • 类似地,使用非常大的最大值,可以拾取的大多数数字将非常接近该最大长度。很少有数字比这个长度短两位数。(你应该在1%的时间内看到它们。)

    完美!非常感谢。这正是我的印象。这段代码实际上可以工作。也许获得随机长度效果的最佳方法是将长度本身随机化,因为它的“单位”较少?我想,但我不确定你想做什么。我正在考虑一种简单的方法,以获得较低数字(页数)的结果更频繁一点,但这与获得可变长度的真实随机数的目的背道而驰,所以这就足够了:)。非常感谢。