public class T { public static void main(String args[]) { int count = 3000000; int[] array = new int[count]; for (int i = 0; i < count; i++) { array[i] = i + 1; } long start = System.currentTimeMillis(); int[] randomArr = getRandomArraay(array, count); // for (int i = 0; i < randomArr.length; i++) // System.out.println(i + ":" + randomArr[i]); long end = System.currentTimeMillis(); System.out.println("Time: " + (end - start) + " ms"); } public static int[] getRandomArraay(int[] originalArray, int number) { if (number > originalArray.length) return null; int[] result = new int[number]; int n = originalArray.length; for (int i = 0; i < number; i++) { int t = (int) (Math.random() * n); result[i] = originalArray[t]; originalArray[t] = originalArray[n - 1]; n--; } return result; } } //1 million: 150ms //2 million: 310ms //3 million: 510ms
public static void main(String[] args) { int a[]=new int[20]; int len=a.length; for(int i=0;i<len;i++) a[i]=i+1; for(int i=0;i<len;i++) { int t1=(int)Math.floor(Math.random()*len); int t2=(int)Math.floor(Math.random()*len); // System.out.println("t1="+t1+",t2="+t2); int temp=a[t1]; a[t1]=a[t2]; a[t2]=temp; }
public class T {
public static void main(String args[]) {
int count = 3000000;
int[] array = new int[count];
for (int i = 0; i < count; i++) {
array[i] = i + 1;
}
long start = System.currentTimeMillis();
int[] randomArr = getRandomArraay(array, count);
// for (int i = 0; i < randomArr.length; i++)
// System.out.println(i + ":" + randomArr[i]);
long end = System.currentTimeMillis();
System.out.println("Time: " + (end - start) + " ms");
} public static int[] getRandomArraay(int[] originalArray, int number) {
if (number > originalArray.length)
return null;
int[] result = new int[number];
int n = originalArray.length;
for (int i = 0; i < number; i++) {
int t = (int) (Math.random() * n);
result[i] = originalArray[t];
originalArray[t] = originalArray[n - 1];
n--;
}
return result;
}
}
//1 million: 150ms
//2 million: 310ms
//3 million: 510ms
sqlServer中是:NewId()
还有用order by也可以随机数据
public static void shuffle(List<?> list)使用默认随机源对指定列表进行置换。所有置换发生的可能性都是大致相等的。
前面描述中使用了不确定的词“大致”,因为随机源只是大致上独立选择位的无偏源。如果它是一个随机选择位的最佳源,那么算法将完全一致的选择置换。此实现向后遍历列表,从最后一个元素一直到第二个元素,将随机选择的元素重复交换到“当前位置”。元素是从列表的一部分随机选择的,该部分列表从第一个元素一直到当前位置(包括)。此方法以线性时间运行。如果指定列表没有实现 RandomAccess 接口并且是一个大型列表,则此实现在改组列表前将指定列表转储到数组中,并将改组后的数组转储回列表中。这避免了二次行为,该行为是原地改组一个“有序访问”列表引起的。 要求效率高的话,算法都不好
8楼的算法随机选择有弊端,每次都要先从前10个选,选走后把最后面的再移到前10某个被移走的位置,中间的数据不能随机打乱,Collections.shuffle()也是为了保证效率高,所有置换发生的可能性都是大致相等的。
它说可能性大致相等是因为Math.random本身就只是一个固定的算法,只能保证可能性尽量均等
int a[]=new int[20];
int len=a.length;
for(int i=0;i<len;i++)
a[i]=i+1;
for(int i=0;i<len;i++)
{
int t1=(int)Math.floor(Math.random()*len);
int t2=(int)Math.floor(Math.random()*len);
// System.out.println("t1="+t1+",t2="+t2);
int temp=a[t1];
a[t1]=a[t2];
a[t2]=temp;
}