【发布时间】:2025-12-03 06:50:02
【问题描述】:
所以,我正在 Coursera 上观看 Robert Sedgewick 的视频,而我目前正在 Shuffling 中。他展示了在线扑克的“写得不好”的洗牌代码(它还有一些其他错误,我已将其删除,因为它们与我的问题无关)这就是算法的工作原理:
for(int i = 0; i < N; i++)
int r = new Random().nextInt(53);
swap(cardArray, i, r);
它迭代所有卡片一次。在每次迭代中,都会生成一个随机数,并将第 i 个卡与第 r 个卡交换。很简单吧?
虽然我了解算法,但我不了解他的概率计算。他说,因为 Random 使用 32 位种子(或 64,这似乎无关紧要),所以这仅限于 2^32 种不同的排列。
他还说 Knuth 的算法更好(同样的 for 循环,但是选择一个介于 1 和 i 之间的数字)因为它给了你 N!排列。
我可以同意 Knuth 的算法计算。但我认为在第一个(应该是错误的)上应该有 N^N 不同的排列。
是塞奇威克错了还是我错过了一个事实?
【问题讨论】:
-
虽然我不明白使用所有
Random(long seed)种子位而不是其中的一半应该不重要,但在每次迭代中实例化一个新的Random对象不仅浪费,而且每个人都有明确的种子,每个人都有义务提供相同的nextXyz()-Value。
标签: java algorithm random shuffle