首页 > 试题广场 >

输出数组的随机序列。

[问答题]
假设有一个数组,里面有10个元素 int a[10]={0, 1, 2, 3, 4, 5, 6, 7, 8, 9}。请写一个算法,得到a数组的一个随机排列。要求时间复杂度尽量小,可以使用random函数。例如输出的随机序列可以是:3 6 2 4 5 1 9 8 0
Y~头像 Y~
import java.util.Random;

public class Test5 {
    public static void main(String[] args) {
        int[] a={0, 1, 2, 3, 4, 5, 6, 7, 8, 9};
        Random rd = new Random();
        int size = 10;
        
        while(size!=0){
            int i=rd.nextInt(size);
            System.out.print(a[i]+" ");
            swap(a,i,size-1);
            size--;
           
        }
    }
    
    public static void swap(int a[],int index,int len){
        int temp = a[index];
        a[index] = a[len];
        a[len] = temp;
    }
}
编辑于 2015-04-27 18:11:46 回复(1)
public class Test {
	private List<Integer> list = new ArrayList<Integer>();
	public String outputSeri(int[] input){
		StringBuilder sb = new StringBuilder();
		Random random = new Random();
		int rd = random.nextInt(10);
		while(list.size() < 10){
			while(list.contains(rd)){
				rd = random.nextInt(10);
			}
			list.add(rd);
			sb.append(input[rd] + " ");			
			System.out.println("随机数为:" + rd);
			rd = random.nextInt(10);
			
		}		
		return sb.toString();
	}

	public static void main(String[] args) {
		int[] a = {0,1,2,3,4,5,6,7,8,9};
		System.out.println(new Test().outputSeri(a));
	}
}

发表于 2016-10-18 10:30:33 回复(0)
javascript:
var array=[0,1,2,3,4,5,6,7,8,9];
array.sort(function(a,b){return Math.random()>0.5});
console.log(array); 

发表于 2015-05-16 20:37:44 回复(0)
经典的随机序列问题,要产生由0~N组成的不重复随机序列,算法如下:

1、按顺序列出0~N,维护一个变量max,max=N;
2、从0~max中产生一个随机数r,将位置r的元素与位置max的元素交换,将max递减1;
3、重复第2步至max等于0;

Java :

import java.util.Arrays;

public class RandomQuestion {

    public static void main(String[] args) {
        int[] a = new int[] { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 };
        
        int max = 9;
        
        while(max != 0){
            int r = (int) (Math.random() * max);            
            swap(a, max, r);
            --max;
        }
        
        System.out.println(Arrays.toString(a));

    }

    private static void swap(int[] arr, int s1, int s2) {
        int tmp = arr[s1];
        arr[s1] = arr[s2];
        arr[s2] = tmp;
    }

}

编辑于 2015-04-27 18:16:18 回复(0)
输出10个指定范围且不同的数组index 时间复杂度O(N - 1)
发表于 2015-02-26 11:37:28 回复(0)
答案:
在数组中随机取一个数,跟第一个交换,
然后在从第二个开始的子序列中随机取一个数,跟第二个交换。。。
public class Test {
 public static void main(String[] args) {
 int a[]={0, 1, 2, 3, 4, 5, 6, 7, 8, 9}; 
 int tmp;
 for(int i=0;i<a.length;i++){
 int random=getRandom(10-i);//获取小于10-i的随机整数
 tmp=a[i];
 a[i]=a[random];
 a[random]=tmp;
 }		 
 for(int i=0;i<a.length;i++){
 System.out.print(a[i]);
 }
 } 
 static int getRandom(int max){
 int k=(int)(Math.random()*max*10)/max;//0到max随机数
 return k;
 }
}

发表于 2015-01-29 18:37:42 回复(1)