锁定老帖子 主题:随机打乱一个数组的顺序
精华帖 (0) :: 良好帖 (0) :: 新手帖 (3) :: 隐藏帖 (0)
|
|
---|---|
作者 | 正文 |
发表时间:2010-06-20
把一个数组的顺序打乱,很常用的算法,比如洗牌。。 代码如下: import java.util.Random; public class RandomSort { private Random random = new Random(); //数组大小 private static final int SIZE = 10; //要重排序的数组 private int[] positions = new int[SIZE]; public RandomSort() { for(int index=0; index<SIZE; index++) { //初始化数组,以下标为元素值 positions[index] = index; } //顺序打印出数组的值 dwn(); } //重排序 public void changePosition() { for(int index=SIZE-1; index>=0; index--) { //从0到index处之间随机取一个值,跟index处的元素交换 exchange(random.nextInt(index+1), index); } dwn(); } //交换位置 private void exchange(int p1, int p2) { int temp = positions[p1]; positions[p1] = positions[p2]; positions[p2] = temp; } //打印数组的值 private void dwn() { for(int index=0; index<SIZE; index++) { System.out.print(positions[index]+" "); } System.out.println(); } public static void main(String[] args) { RandomSort rs = new RandomSort(); rs.changePosition(); rs.changePosition(); rs.changePosition(); } } 不过由于随机数产生器产生的随机数不太随机,所以排序的结果页有很多相似的地方。换一个好的随机数产生器,会达到更好的效果,就能用于洗牌了,呵呵。 声明:ITeye文章版权属于作者,受法律保护。没有作者书面许可不得转载。
推荐链接
|
|
返回顶楼 | |
发表时间:2010-06-21
呃。这个算法是算法导论上的一道课后习题。
而根据算法导论上所说的,这个算法是无法产生一个均匀随机排列的,只能是近似随机排列。 算法导论上给出的方法是为每个arr[i]分配一个随机的优先级,然后依据优先级对数组中的元素进行排序。 |
|
返回顶楼 | |
发表时间:2010-06-21
呃, 没看过算法导论。。。
|
|
返回顶楼 | |
发表时间:2010-06-22
这个应该给新手帖
|
|
返回顶楼 | |
发表时间:2010-06-22
Collections.shuffle(list);
这个就能达到你的要求 |
|
返回顶楼 | |
发表时间:2010-06-22
Collections.shuffle(list) 里用的方法和楼主的一样。
这个时间复杂度比较低 |
|
返回顶楼 | |
发表时间:2010-07-09
很好的方法。。。学习了 collections.shuffle(list) perfect
|
|
返回顶楼 | |
发表时间:2010-07-09
如果可以用下LinkedList的话 这个能模拟下随机发牌
static void go(){ LinkedList<Integer> ll=new LinkedList<Integer>(); int n=10; for(int i=1;i<=n;i++)ll.add(i); Random r=new Random(); for(int i=0;i<n;i++)System.out.print(ll.remove(r.nextInt(ll.size()))+","); System.out.println(); } public static void main(String...args){ go();go();go();go();go(); } |
|
返回顶楼 | |
发表时间:2010-07-09
Ulysses 写道 呃。这个算法是算法导论上的一道课后习题。
而根据算法导论上所说的,这个算法是无法产生一个均匀随机排列的,只能是近似随机排列。 算法导论上给出的方法是为每个arr[i]分配一个随机的优先级,然后依据优先级对数组中的元素进行排序。 就是需要产生的随机数总数要大于N!,要不然难以覆盖全部情况。 |
|
返回顶楼 | |
发表时间:2010-07-10
果然牛人很多!
|
|
返回顶楼 | |