首页 > 试题广场 >

给定一个数组,设计一个既高效又公平的方法随机打乱这个数组。

[问答题]
【编程题】

给定一个数组,设计一个既高效又公平的方法随机打乱这个数组。

将原数组的值,存入vec,vec为Vector的实例 Math.Random类随机生成下标index,范围在[0,vec.size()-1], 将vec.get(index)依次存入原数组,然后vec.remove(index), 直到vec.size()==0结束。
发表于 2017-07-25 12:43:37 回复(0)
import java.util.Random;
import java.util.Scanner;
public class Main {
   
  static Random random = new Random();
 public static void main(String[] args) {
  // TODO Auto-generated method stub
     Scanner sc = new Scanner(System.in);
     int count = sc.nextInt();
     int number[] = new int[count];
     for(int i = 0; i < count; i++)
     {
      number[i] = sc.nextInt();
     }
     for(int j = number.length-1; j > 1; j--)
     {
      shuffe(number,j);
     }
     for(int i = 0; i < number.length; i++)
     {
      System.out.println(number[i]);
     }
     
 }
 public static void shuffe(int[] b,int w)
 {
  swap(b,w,random.nextInt(w));
 }
 public static void swap(int[] a, int i, int j)
 {
  int temp; 
  temp = a[i];
  a[i] =  a[j];
  a[j] = temp;
 }
} 

发表于 2017-08-21 16:35:09 回复(0)
//JavaScript实现
//通过随机产生0到1的数,然后判断是否大于0.5从而影响排序,产生随机性的效果。
function randomSort(arr){
	arr.sort(function(value1, value2){
		return Math.random() > 0.5 ? 1 : -1;
	});
	return arr;
}
console.log(randomSort([1,2,3,4,5,6,7,8,9,10]));

编辑于 2017-08-04 09:42:19 回复(0)
对于A[i],i=0,1,2,...N-1,随机在数组A[i,i+1,..N-1]中挑选一个数字交换到A[i]。 为什么这么做会随机? 证明算法随机,只需证明每个数字分配到每个位置的概率是相等的。 易得,数组0-N-1位置的任意一个数字到位置0的概率都是1/n 到位置1的概率是(1-1/n)*(1/(n-1))=1/n 解释:P(到位置1)=P(第一次调用随机算法的时候没交换到位置0)P(第二次到位置1|第一次调用随机算法的时候没交换到位置0) 到位置2的概率是(1-1/n)(1-1/(n-1))(1/n-2)=1/n ...
发表于 2017-07-30 08:57:06 回复(0)
import random

arr=list(range(0,10))
print(arr)
random.shuffle(arr)
print(arr)

发表于 2019-09-12 23:35:58 回复(0)
function randomArray(arr){ arr.sort(function(a,b){ return 0.5-Math.random(); }) return arr; }
发表于 2017-08-21 19:39:13 回复(0)
public class Test2 {

public static void main(String[] args) {
int array[]={11,12,13,14,15};
int newArray[]=new int[array.length];
int a[]=new int[array.length];
int i=0;
outer:
while(true){
a[i]=(int)Math.round(Math.random()*4);
newArray[i]=array[a[i]];
if(i>0){
             for(int k=0;k<i;k++){
            if(a[i]==a[k]){
            continue outer;
            }
             }
             i++;
}else{
i++;
}
if(i>=a.length){
break;
}
}
for(i=0;i<a.length;i++){
System.out.print(a[i]);
}
System.out.println();
for(i=0;i<newArray.length;i++){
System.out.println(newArray[i]);
}
}
}

发表于 2017-08-19 12:40:17 回复(0)
随机两个个数,设为这个数组的新位置,两个数所对应的数组里的值相互交换
发表于 2017-07-27 10:21:04 回复(0)
while([old].length !== 0){
    var newNum = [old][Math.ceil(Math.random()*[old].length)-1],
        oldIndex = [old].indexOf(newNum);
        [new].push(newNum),
        [old].splice(oldIndex,1);
}

发表于 2017-07-27 00:16:43 回复(0)
每次随机取出一个不同的值放到一个空数组
发表于 2017-07-25 01:40:38 回复(0)