随机不重复排序算法及Java产生随机数的3种方式

一  随机不重复排序算法

  • 问题描述

       给定任意个不重复的数字,对其进行随机排序

  • 算法分析

       首先想到可以将给定的数字放在一个集合A中,初步定为一个ArrayList,这样,可以用A集合的长度来做为随机数的基数,取出一个数x,放到结果集合B中,然后将数x从A集合删除;接着用A集合剩下的长度作为基础重复上一步操作,最终可以得到结果集合B。考虑到用Arraylist删除比较慢,可以用LinkedList来代替。也可以用数组来模拟LinkedList


public class Test_ZhongHe {



public static void random_sort(Integer[] arr) {
// 将数组中的数放到一个容器中,根据容器的长度随机产生一个数,取出该数,
// 存到另一个容器中,且删除原来容器的这个数,此时原来容器的长度会减1,
// 则产生随机数的范围也会减一,如下:
// int tmp = new Random().nextInt(len - i);



// 将此随机数对应的list中的数,存到结果的对应位置
// resultList[i] = lt.get(tmp);
LinkedList<Integer> lt = new LinkedList<Integer>(Arrays.asList(arr));
System.out.print("随机排序前:");
for (int t : lt) {
System.out.print(t + " ");
}
System.out.println();
int len = lt.size();
// 存放随机排序的结果
int[] resultList = new int[len];
Random rand = new Random();
for (int i = 0; i < len; i++) {
// 产生一个随机数
int tmp = rand.nextInt(len - i);
// 将此随机数对应的list中的数,存到结果的对应位置
resultList[i] = lt.get(tmp);
// 删除已挑选出的元素
lt.remove(tmp);
}
System.out.print("随机排序后:");

// 展现结果
for (int t : resultList) {
System.out.print(t + " ");
}
}


public static void main(String[] args) {
Integer[] arr = { 1, 3, 4, 6, 9 };
random_sort(arr);
}

}

二  Java产生随机数的几种方式

 

1.在j2se里我们可以使用Math.random()方法来产生一个随机数,这个产生的随机数是[0-1)(不包含1)之间的一个double,我们可以把他乘以一定的数,比如说乘以100,他就是个100以内的随机。  

    r=Math.random的范围:0.0<=r<1.0

                   Math.random()*10+1;   //  1---10;

               Math.random()*10  ;     //   0-----9

2. 在java.util这个包里面提供了一个Random的类,我们可以新建一个Random的对象来产生随机数,他可以产生随机整数、随机float、随机double,随机long,这个也是经常用的一个取随机数的方法。 

3.   在我们的System类中有一个currentTimeMillis()方法,这个方法返回一个从1970年1月1号0点0分0秒到目前的一个毫秒数,返回类型是long,我们可以拿他作为一个随机数,我们可以拿他对一些数取模,就可以把他限制在一个范围之内啦 

其实在Random的默认构造方法里也是使用上面第三种方法进行随机数的产生的 


对于方法二中的Random类有以下说明: 

java.util.Random类有两种方式构建方式:带种子和不带种子 

不带种子: 此种方式将会返回随机的数字,每次运行结果不一样 (即不带参数的Random()构造函数)

public class RandomTest { 
public static void main(String[] args) { 
  java.util.Random r=new java.util.Random(); 
for(int i=0;i<10;i++){ 
        System.out.println(r.nextInt());   // 每次运行产生的10个数 的序列 都不一样。



带种子: 此种方式,无论程序运行多少次,返回结果都是一样的 (即带参数的Random(n)构造函数)

public static void main(String[] args) { 
  java.util.Random r=new java.util.Random(10); 
  for(int i=0;i<10;i++){ 
         System.out.println(r.nextInt()); // 每次运行产生的10个数 的序列 都一样。
     } 


两种方式的差别在于 


(1)  
如果用 相同的种子 创建两个 Random 实例,则对每个实例进行相同的方法调用序列,它们将生成并返回相同的数字序列。


(2) 如果没有提供种子数,Random实例的种子数将是当前时间的毫秒数,可以通过System.currentTimeMillis()来获得当前时间的毫秒数。打开JDK的源代码,

        public Random() { this(System.currentTimeMillis()); } 


另外:  random对象的nextInt(),nextInt(int n)方法的说明: 


int nextInt()  
  

    返回下一个伪随机数,它是此随机数生成器的序列中均匀分布的 int 值,

                 产生的随机数的范围:  nextInt() --- [0, 31] 

int nextInt(int n)  
 

     返回一个伪随机数,它是从此随机数生成器的序列中取出的、在 0(包括)和指定值(不包括)之间均匀分布的 int值,产生的随机数的范围是 :nextInt(n)------- [0, n-1]

 


参考:http://blog.csdn.net/u010802573/article/details/9159747

             java随机数原理及应用  http://tech.e800.com.cn/articles/2009/1224/1261632576056_1.html

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值