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
在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())
}
关键点说明:
- 使用
math/big.Int:对于超过int64范围的数字,必须使用big.Int - 随机数生成:使用
crypto/rand包生成密码学安全的随机数 - 比较操作:使用
Cmp()方法比较大小,返回-1、0、1 - 运算方法:使用
Add(),Sub(),Mul()等方法进行运算,这些方法会修改接收者
你的原始代码中每次循环都重新初始化count为77,这会导致无限循环。如果需要递增,应该使用同一个big.Int实例的Add()方法。


