Golang生成大数字的方法与技巧

Golang生成大数字的方法与技巧 我想生成一个介于 1 和 11003746553177333670973076095724981362930873955835419598865333617435674804223 之间的数字。

经过多次搜索,我仍然找不到任何方法。以下是我的部分代码:

	// Initialise big numbers with small numbers
count := big.NewInt(0)
count.SetString(String(77), 10)

// Loop forever because we're never going to hit the end anyway
for {
	// Increment our counter
	count := big.NewInt(0)
	count.SetString(String(77), 10)

更多关于Golang生成大数字的方法与技巧的实战教程也可以访问 https://www.itying.com/category-94-b0.html

5 回复

非常感谢 😄

更多关于Golang生成大数字的方法与技巧的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


在1000和11003746553177333670973076095724981362930873955835419598865333617435674804223之间随机选取一个数?

Nosferatu_fist:

在 1000 和 11003746553177333670973076095724981362930873955835419598865333617435674804223 之间生成一个随机 [数字]?

请参考我修改过的、之前的回答。设置:

min = 1000 max = 11003746553177333670973076095724981362930873955835419598865333617435674804223

我想生成一个介于 1 和 11003746553177333670973076095724981362930873955835419598865333617435674804223 之间的 [随机] 数。

package main

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

// randInt returns a random number in the interval [min, max]
func randInt(min, max *big.Int) (*big.Int, error) {
	if min.Cmp(max) > 0 {
		min, max = max, min
	}
	intvl := new(big.Int)
	intvl.Add(intvl.Sub(max, min), big.NewInt(1))
	r, err := rand.Int(rand.Reader, intvl)
	if err != nil {
		return nil, err
	}
	r.Add(r, min)
	return r, nil
}

func main() {
	min, ok := new(big.Int).SetString(
		"1",
		10,
	)
	if !ok {
		return
	}
	max, ok := new(big.Int).SetString(
		"11003746553177333670973076095724981362930873955835419598865333617435674804223",
		10,
	)
	if !ok {
		return
	}
	fmt.Println(min, max)
	r, err := randInt(min, max)
	fmt.Println(r, err)
	if err != nil {
		return
	}
}

Go Playground - The Go Programming Language

1 11003746553177333670973076095724981362930873955835419598865333617435674804223
10540576144031712458356493685186348014723344343763680035148450277505266702161 <nil>

在Go语言中处理大数字需要使用math/big包。以下是几种生成指定范围内大整数的方法:

方法1:使用随机数生成

package main

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

func main() {
    // 定义上限(你提供的最大值)
    max := new(big.Int)
    max.SetString("11003746553177333670973076095724981362930873955835419598865333617435674804223", 10)
    
    // 生成1到max之间的随机数
    // 因为crypto/rand生成的是[0, max)的随机数,所以需要+1
    maxPlusOne := new(big.Int).Add(max, big.NewInt(1))
    n, err := rand.Int(rand.Reader, maxPlusOne)
    if err != nil {
        panic(err)
    }
    
    // 确保结果>=1
    if n.Cmp(big.NewInt(1)) < 0 {
        n.Set(big.NewInt(1))
    }
    
    fmt.Printf("生成的随机数: %s\n", n.String())
}

方法2:生成特定值(如你的示例中的77)

package main

import (
    "fmt"
    "math/big"
)

func main() {
    // 直接设置特定值
    count := new(big.Int)
    count.SetString("77", 10)
    
    // 验证是否在范围内
    max := new(big.Int)
    max.SetString("11003746553177333670973076095724981362930873955835419598865333617435674804223", 10)
    
    if count.Cmp(big.NewInt(1)) >= 0 && count.Cmp(max) <= 0 {
        fmt.Printf("数字 %s 在有效范围内\n", count.String())
    }
}

方法3:递增循环示例(修正你的代码)

package main

import (
    "fmt"
    "math/big"
)

func main() {
    // 初始化起始值
    count := new(big.Int)
    count.SetString("77", 10)
    
    // 定义上限
    max := new(big.Int)
    max.SetString("11003746553177333670973076095724981362930873955835419598865333617435674804223", 10)
    
    // 递增示例(注意:这会循环很长时间)
    one := big.NewInt(1)
    for i := 0; i < 10; i++ { // 只演示10次递增
        // 检查是否超过上限
        if count.Cmp(max) >= 0 {
            break
        }
        
        fmt.Printf("当前值: %s\n", count.String())
        
        // 递增
        count.Add(count, one)
    }
}

方法4:生成范围内的任意大数

package main

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

func generateBigIntInRange(min, max *big.Int) (*big.Int, error) {
    // 计算范围大小
    rangeSize := new(big.Int).Sub(max, min)
    rangeSize = rangeSize.Add(rangeSize, big.NewInt(1)) // +1 包含上限
    
    // 生成随机数
    n, err := rand.Int(rand.Reader, rangeSize)
    if err != nil {
        return nil, err
    }
    
    // 加上最小值
    return n.Add(n, min), nil
}

func main() {
    min := big.NewInt(1)
    max := new(big.Int)
    max.SetString("11003746553177333670973076095724981362930873955835419598865333617435674804223", 10)
    
    result, err := generateBigIntInRange(min, max)
    if err != nil {
        panic(err)
    }
    
    fmt.Printf("生成的数: %s\n", result.String())
}

关键点说明:

  1. 使用math/big.Int:对于超过int64范围的数字,必须使用big.Int
  2. 随机数生成:使用crypto/rand包生成密码学安全的随机数
  3. 比较操作:使用Cmp()方法比较大小,返回-1、0、1
  4. 运算方法:使用Add(), Sub(), Mul()等方法进行运算,这些方法会修改接收者

你的原始代码中每次循环都重新初始化count为77,这会导致无限循环。如果需要递增,应该使用同一个big.Int实例的Add()方法。

回到顶部