所以,我正在观看Robert Sedgewick关于Coursera的视频,而我现在正在洗牌.他正在为在线扑克显示一个"写得不好"的洗牌代码(它有一些其他的错误,我已经将其删除,因为它们与我的问题无关)这就是算法的工作原理:
for(int i = 0; i < N; i++)
int r = new Random().nextInt(53);
swap(cardArray, i, r);
Run Code Online (Sandbox Code Playgroud)
它迭代所有卡片一次.在每次迭代时,生成随机数,并且第i个卡与第r个卡交换.简单吧?
虽然我理解算法,但我不理解他的概率计算.他说,因为Random使用32位种子(或64,它似乎并不重要),这仅限于2 ^ 32种不同的排列.
他还说Knuth的算法更好(循环相同,但选择1和i之间的数字),因为它给你N!排列.
我同意Knuth的算法计算.但我认为在第一个(应该是错误的)上应该有N ^ N个不同的排列.
塞奇威克错了还是我错过了一个事实?
我知道TreeSet是有序的.但这是否保证每次创建迭代器时,它都会以相同的顺序遍历集合的元素(假设我没有添加/删除任何元素)?