- 这个问题和大量重复答案的关键区别在于,输入数组很短,只有3个元素。* --
假设我有一个int
的有序集合。数组的大小只有3(或更多)。我需要随机化它们的顺序并返回一个新数组。虽然这是一个纯算法问题,但首选的答案语言是Go。
- 对于Python,How can I output a list in random order?,答案是
random.shuffle
。 - 对于Go,https://yourbasic.org/golang/shuffle-slice-array/,答案应该是
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]
这看起来并不是随机的。
有什么好主意可以更好地随机化一个短的3元素数组吗?
顺便说一句
- How to output array elements in random order using VHDL说使用linear feedback shift register,但我不认为这是一个好主意。
- How to randomize (shuffle) a JavaScript array?给出了Durstenfeld Shuffle 算法,这是Fisher-Yates的优化版本。但我认为它的结果与Go的
rand.Shuffle
非常相似。是吗?
1条答案
按热度按时间col17t5w1#
将
random.Seed
从shuffle函数移到main函数。每个程序只能执行一次PRNG的种子操作,成功的随机性模拟是通过生成器的状态转换而不是种子操作完成的。除非您真正了解PRNG的工作原理,并且出于可重复性等原因试图显式控制该过程,否则不要重新执行种子操作。下面对代码的简单修改应该可以满足您的需求:
这会产生以下结果: