最近在JAVA中学习了洗牌算法。
洗牌算法是常见的随机问题;它可以抽象成:得到一个M以内的所有自然数的随机顺序数组。
常见问题描述:
1.将自然数1 ~ 100随机插入到一个大小为100的数组,无重复元素
2. 1 ~ 52张扑克牌重新洗牌
现在来看看我的代码吧!
import java.util.Random;
import java.util.Scanner;
public class Test01 {
public static void main(String[] args) {
System.out.println("输入成绩");
Scanner scan = new Scanner(System.in);
double[] score = new double[5];
for(int i=0; i < score.length; i++){
System.out.println("第"+(i+1)+"次");
score[i] = scan.nextDouble();
}
for(int i=0; i < score.length; i++)//输出
{
System.out.print(score[i]+"\t");
}
System.out.println();
double sum = 0;
for(int i=0; i < score.length; i++) {
sum += score[i];
}
System.out.println("和为"+sum);
System.out.print("平均数是" +(sum/score.length));
double max = score[0];
for (int i =0; i < score.length; i++)
{
if (score[i] > max)
max = score[i];
}
System.out.println("最大值"+max);
int maxID = 0;
for (int i =1; i < score.length; i++){
if (score[i] > score[maxID])
maxID =i;
}
System.out.println("最大值"+score[maxID]);
int a =3;
int b =5;
int temp = a ;
a = b;
b = temp;
int temp1= 0;
for(int i =0; i<score.length-1; i++)
{
temp1 =i;
for(int j = i+1; j < score.length;j++)
{
if(score[j] > score[temp1])
temp1 = j;
if(i!= temp1){
double a1 = score[i];
score[i] = score[temp1];
score[temp1] = a1;
}
for(int i1 =0; i1 < score.length;i1++)
System.out.print(score[i1]+"\t");
}
System.out.println();
for(int i1 = 0; i1 < score.length-1; i1++)//洗牌算法
{
int p =(new Random(1).nextInt(score.length-i1)+i1);
double a1 = score[i1];
score[i1] = score[p];
score[p] = a1;
}
}
}
}