php小编小新为大家带来了一篇关于Go语言中短数组输出顺序随机化的算法的文章。在Go语言中,短数组的输出顺序是不确定的,这是由于Go语言的并发特性所导致的。文章将介绍一种基于随机数生成器的算法,可以实现对短数组输出顺序的随机化,让程序执行时每次输出的顺序都不同,增加程序的灵活性和变化性。通过阅读本文,读者可以了解到如何在Go语言中实现短数组输出顺序的随机化,并应用于自己的项目中。
这个问题与大量重复答案之间的主要区别在于,输入数组很短,只有 3 个元素。 --
假设我有一组有序的 int
。数组的大小只有 3(或更多)。我需要随机化它们的顺序并返回一个新数组。虽然是纯算法题,但是首选的答案语言是go。
random.shuffle
。rand.shuffle
。但是,这是我的代码:
https://go.dev/play/p/cvu8_q96-9f
func randshuffle(a []int) { rand.seed(time.now().unixnano()) rand.shuffle(len(a), func(i, j int) { a[i], a[j] = a[j], a[i] }) }
这是我的测试运行结果之一:
[2 1 3] [1 3 2] [2 1 3] [2 1 3] [1 3 2] [1 2 3] [2 3 1]
这似乎不是很随机。
对于短的三元素数组有更好的随机化有什么好主意吗?
顺便说一句,
rand.shuffle
非常相似。是吗?将 random.seed
从随机播放函数移至主函数。每个程序只能进行一次 prng 的播种,随机性的成功模仿是通过生成器的状态转换而不是种子来完成的。除非您真正了解 prng 的工作原理并出于可重复性等原因尝试明确控制该过程,否则请勿重新播种。
对代码进行以下简单修改即可满足您的需求:
package main import ( "fmt" "math/rand" "time" ) func main() { rand.seed(time.now().unixnano()) a := []int{1, 2, 3} for i := 0; i < 10; i++ { randshuffle(a) fmt.println(a) } } func randshuffle(a []int) { rand.shuffle(len(a), func(i, j int) { a[i], a[j] = a[j], a[i] }) }
这会产生如下结果:
[2 3 1] [3 1 2] [2 1 3] [2 3 1] [1 2 3] [1 3 2] [1 2 3] [3 1 2] [3 2 1] [2 3 1]
以上是Go 中短数组的输出顺序随机化的算法的详细内容。更多信息请关注PHP中文网其他相关文章!