Redian新闻
>
求问一道数组shuffle的问题
avatar
求问一道数组shuffle的问题# JobHunting - 待字闺中
c*l
1
数组shuffle,经典的Fisher and Yates的算法是
public static void shuffle(List list, Random rnd) {
int size = list.size();
for (int i=size; i>1; i--)
swap(list, i-1, rnd.nextInt(i));
}
}
如果将
swap(list, i-1, rnd.nextInt(i));
改成
swap(list, i-1, rnd.nextInt(N));
会出错。
具体出错的原因是什么?怎么描述这种现象?
avatar
l*a
2
shuffle的目标是每次确定当前位置上的元素,然后处理下一个
你用Random.nextInt(N)显然不满足这个

【在 c********l 的大作中提到】
: 数组shuffle,经典的Fisher and Yates的算法是
: public static void shuffle(List list, Random rnd) {
: int size = list.size();
: for (int i=size; i>1; i--)
: swap(list, i-1, rnd.nextInt(i));
: }
: }
: 如果将
: swap(list, i-1, rnd.nextInt(i));
: 改成

avatar
c*l
3
为什么不满足“每次确定当前位置上的元素,然后处理下一个”这一个条件,
会导致出错?
换句话,每次在当前位置上元素时,瞎抓一气,岂不是更random吗?

【在 l*****a 的大作中提到】
: shuffle的目标是每次确定当前位置上的元素,然后处理下一个
: 你用Random.nextInt(N)显然不满足这个

avatar
j*y
4
可以使试试 {1, 2, 3} ,用第二种方法我好像得出 出现 1 2 3 这种排列的概率是
4 /27. 等概率的话应该是 1 / 6

【在 c********l 的大作中提到】
: 数组shuffle,经典的Fisher and Yates的算法是
: public static void shuffle(List list, Random rnd) {
: int size = list.size();
: for (int i=size; i>1; i--)
: swap(list, i-1, rnd.nextInt(i));
: }
: }
: 如果将
: swap(list, i-1, rnd.nextInt(i));
: 改成

avatar
c*l
5
我是用统计的方法证明了模拟xxxxxx遍之后,得出的shuffle结果是biased
但是有没有用数学理论能解释现象的?
而且大数模拟之后,每个初始element的分布也不一样

【在 j*****y 的大作中提到】
: 可以使试试 {1, 2, 3} ,用第二种方法我好像得出 出现 1 2 3 这种排列的概率是
: 4 /27. 等概率的话应该是 1 / 6

avatar
d*3
6
总共有n!种排列,第二种算法产生的排列数是n^n的,必然有重复,要保证等概率的至
少要有保证n^n 能整除 n!,但这个反例就很多了。。。
avatar
j*y
7
不错.

【在 d*******3 的大作中提到】
: 总共有n!种排列,第二种算法产生的排列数是n^n的,必然有重复,要保证等概率的至
: 少要有保证n^n 能整除 n!,但这个反例就很多了。。。

avatar
r*h
8
言简意赅,赞

【在 d*******3 的大作中提到】
: 总共有n!种排列,第二种算法产生的排列数是n^n的,必然有重复,要保证等概率的至
: 少要有保证n^n 能整除 n!,但这个反例就很多了。。。

avatar
c*l
9
thanks

【在 d*******3 的大作中提到】
: 总共有n!种排列,第二种算法产生的排列数是n^n的,必然有重复,要保证等概率的至
: 少要有保证n^n 能整除 n!,但这个反例就很多了。。。

相关阅读
logo
联系我们隐私协议©2024 redian.news
Redian新闻
Redian.news刊载任何文章,不代表同意其说法或描述,仅为提供更多信息,也不构成任何建议。文章信息的合法性及真实性由其作者负责,与Redian.news及其运营公司无关。欢迎投稿,如发现稿件侵权,或作者不愿在本网发表文章,请版权拥有者通知本网处理。