将一个数组or列表打乱的几种基本方法
一、交换打乱方法
从头开始
//交换函数
void swap (int *a, int i, int j)
{
int tmp = a[i];
a[i] = a[j];
a[j] = tmp;
}
//从头打乱
for (i =0; i < a.length; i++)
{
index = rand()%(a.length); //打乱所有人顺序
swap (a,i,index);
}
从尾开始
//交换函数
void swap (int *a, int i, int j)
{
int tmp = a[i];
a[i] = a[j];
a[j] = tmp;
}
//从尾打乱
for (i = len-1; i > 0; i--)
{
index = rand()%(i+1); //打乱所有人顺序
swap (a,i,index);
}
方法很简单,就是遍历一遍数组,然后将每一个元素与随机出来的下标进行交换。
但是第二种是交换完之后就将这个元素从随机下标的范围里拿出去,不再进行交换,而第一种不拿出去,有可能该元素会再被后面的元素交换。
第二种方法是网上看到的,因为概率论学的不好,有心而无力,所以也不能证明这种遍历就比第一种好或者坏。但是类似于我们现实中玩扑克,你随便打乱一下就OK,觉得不行就再打乱一次呗。
二、创立新数组法
//使用Java写的列表
ArrayList new=new ArrayList();
for(int i=0;;i++)
{
if(new.size()==old.size())
break;
int n=(int)(Math.random()*old.size());
if(!new.contains(old.get(n)))
{
new.add(old.get(n));
}
}
这种方法建立一个新列表,然后把旧列表中的元素随机选出并加入新列表。
但是运用时发现,只适用于列表不太长的情况,我当时用的元素个数是200,发现循环的超久的,比如:当你把旧列表中选出了199个,那剩下的一个就不是那么容易就能随机到的
Collections
实际上Java中Collections具有方法shuffle(List)可以将列表元素随机打乱
新
如果你有更好的方法,或者有什么见解,
可以评论一下( ̄▽ ̄)~*