You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用math/rand/v2 API初始化带种子的随机数生成器?

Go math/rand/v2 带种子随机数生成器初始化与Shuffle方法使用

初始化带种子的Source

在math/rand/v2中,NewSource函数被移除,取而代之的是具体的Source实现构造函数,比如官方推荐的PCG生成器:

  • 使用rand.NewPCG(seedHi, seedLo)创建带种子的PCG生成器,它直接实现了rand.Source接口。
  • 若需要兼容v1的*Rand结构(包含各种高层随机方法),将PCG实例传入rand.New()即可得到*Rand对象。

解决PCG无Shuffle方法的问题

PCG本身是底层Source实现,没有提供Shuffle这类高层方法,但*Rand类型包含Shuffle方法。只需通过rand.New(pcg)将PCG包装为*Rand实例,就能调用Shuffle。

完整代码示例

package main

import (
	"fmt"
	"math/rand/v2"
)

func main() {
	// 将64位种子拆分为高低32位,作为PCG的种子参数
	seed := uint64(123456)
	pcg := rand.NewPCG(seed>>32, seed&0xFFFFFFFF)
	
	// 包装为*Rand实例,获得Shuffle等高层方法
	rng := rand.New(pcg)

	// 使用Shuffle打乱切片
	items := []string{"a", "b", "c", "d", "e"}
	rng.Shuffle(len(items), func(i, j int) {
		items[i], items[j] = items[j], items[i]
	})

	fmt.Println("打乱后的结果:", items)
}

补充说明

  • v2中所有官方提供的Source实现(如PCG、XorShift64Star)都可传入rand.New(),生成具备完整高层方法的*Rand实例。
  • 若需自定义Source,只需实现rand.Source接口的Uint64() uint64方法,再传入rand.New()即可使用所有高层方法。

内容的提问来源于stack exchange,提问作者bahaelaila7

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.17 19:45:55