【Java】利用Collections类下的shuffle洗牌方法改进在一定的范围内产生不重复的随机数

上次在《【Java】在一定的范围内产生不同的随机数》(点击打开链接)上所提到的方法,尽管已经解决了一定范围内产生不同随机数的问题,运行速度已经可以的,至少不会弄很久都弄不好,其实利用Collections类下的shuffle方法思想可以更清晰、速度更快地在一定的范围内产生不同的随机数。

Collections类下的shuffle方法是可以随机打乱一个数组中的元素的程序,也叫做洗牌方法。

有这个方法,配合我在《【Java】Java中的Collections类——Java中升级版的数据结构》(点击打开链接)中介绍的动态数组ArrayList,此题就已经终结了:

import java.util.*;
public class shuffleTest {
	public static void main(String[] args) {
		//创建一个动态数组
		ArrayList<Integer> randomArr=new ArrayList<Integer>();
		//在里面塞进1-20,你喜欢完全可以改改这个for循环,在里面塞什么都可以
		for(int i=1;i<=20;i++){
			randomArr.add(i);
		}
		//对这个动态数组进行洗牌
		Collections.shuffle(randomArr);
		//打印这个动态数组
		System.out.println(randomArr);
		}
}

这样就实现了在1-20的范围内生产不重复的随机数,运行结果如下:

笔者再于此基础上让程序在1-N范围内产生300组随机数,不重复,以测试此程序的性能,见如下的代码:

import java.util.*;
public class shuffleTest {
	public static void main(String[] args) {
		ArrayList<Integer> randomArr=new ArrayList<Integer>();
		for(int n=1;n<=300;n++){
		System.out.printf("在1-%d的范围内产生随机数,不重复",n);
		for(int i=1;i<=n;i++){
			randomArr.add(i);
		}
		Collections.shuffle(randomArr);
		System.out.println(randomArr);
		randomArr=new ArrayList<Integer>();
		}
	}
}

程序运行结果如下,运行的时候明显速度比上一次《【Java】在一定的范围内产生不同的随机数》(点击打开链接)上所提到的方法快多了。

时间: 2024-11-04 13:24:08

【Java】利用Collections类下的shuffle洗牌方法改进在一定的范围内产生不重复的随机数的相关文章

python 利用random的shuffle洗牌方法生产1个12位数的随机密码

  1 # !/usr/bin/env python                                                              2 # -*- coding:utf-8 -*-                                                              3 import random                                                             

java 静态导入、System类、Date类、Runtime类、Calendar类、Collections类中的shuffle方法、Math类

/* JDK1.5版本新特性(续):静态导入 注意:当类名重名时,需要指定具体的包名: 当方法名重名时,需要指定具体的类名. */ import java.util.*; import static java.util.Arrays.*;//导入Arrays工具类中的所有静态成员. import static java.lang.System.*;//导入了System类中所有的静态成员,注意System类中的成员都是静态的. class StaticImport { public static

JAVA中Integer类下的常用方法有哪些?

JAVA中Integer类下的常用方法有哪些?1.进制转换 n进制转10进制 字符串结果 Integer.parseInt(String s, int radix): radix范围为2-36(包括0-9,a-z) string输入为二进制字符串 System.out.println( Integer.parseInt("10000",2)); //16 2.int转二进制字符串 System.out.println( Integer.toBinaryString(789)); //1

1965: [Ahoi2005]SHUFFLE 洗牌

1965: [Ahoi2005]SHUFFLE 洗牌 Time Limit: 3 Sec  Memory Limit: 64 MBSubmit: 408  Solved: 240[Submit][Status][Discuss] Description 为了表彰小联为Samuel星球的探险所做出的贡献,小联被邀请参加Samuel星球近距离载人探险活动. 由于Samuel星球相当遥远,科学家们要在飞船中度过相当长的一段时间,小联提议用扑克牌打发长途旅行中的无聊时间.玩了几局之后,大家觉得单纯玩扑克

Map集合、HashMap集合、LinkedHashMap集合、Hashtable集合、Collections工具类和模拟斗地主洗牌和发牌

1.Map集合概述和特点 * A:Map接口概述  * 查看API可以知道:  * 将键映射到值的对象  * 一个映射不能包含重复的键  * 每个键最多只能映射到一个值 * B:Map接口和Collection接口的不同  * Map是双列的,Collection是单列的  * Map的键唯一,Collection的子体系Set是唯一的  * Map集合的数据结构值针对键有效,跟值无关;Collection集合的数据结构是针对元素有效 2.Map集合的功能概述 * A:Map集合的功能概述  *

Java中Collections类的排序sort函数两种用法 (转http://viver120.blog.163.com/blog/static/60072482013010111228695/)

java中的Colletions类主要实现列表List的排序功能.根据函数参数的传递,具体的排序可以分为 : 1.  自然排序(natural ordering). 函数原型:sort(List<T> list)说明:参数是要参与排序列表的List对象                                                               实例说明:参与排序的列表的元素Student必须实现Comparable接口的public int compareTo(

bzoj1965 [Ahoi2005]SHUFFLE 洗牌

Description 为了表彰小联为Samuel星球的探险所做出的贡献,小联被邀请参加Samuel星球近距离载人探险活动. 由于Samuel星球相当遥远,科学家们要在飞船中度过相当长的一段时间,小联提议用扑克牌打发长途旅行中的无聊时间.玩了几局之后,大家觉得单纯玩扑克牌对于像他们这样的高智商人才来说太简单了.有人提出了扑克牌的一种新的玩法. 对于扑克牌的一次洗牌是这样定义的,将一叠N(N为偶数)张扑克牌平均分成上下两叠,取下面一叠的第一张作为新的一叠的第一张,然后取上面一叠的第一张作为新的一叠

【bzoj1965】[Ahoi2005]SHUFFLE 洗牌 - 快速幂

为了表彰小联为Samuel星球的探险所做出的贡献,小联被邀请参加Samuel星球近距离载人探险活动. 由于Samuel星球相当遥远,科学家们要在飞船中度过相当长的一段时间,小联提议用扑克牌打发长途旅行中的无聊时间.玩了几局之后,大家觉得单纯玩扑克牌对于像他们这样的高智商人才来说太简单了.有人提出了扑克牌的一种新的玩法. 对于扑克牌的一次洗牌是这样定义的,将一叠N(N为偶数)张扑克牌平均分成上下两叠,取下面一叠的第一张作为新的一叠的第一张,然后取上面一叠的第一张作为新的一叠的第二张,再取下面一叠的

【bzoj1965】 [Ahoi2005]SHUFFLE 洗牌 欧拉定理

题目描述 为了表彰小联为Samuel星球的探险所做出的贡献,小联被邀请参加Samuel星球近距离载人探险活动. 由于Samuel星球相当遥远,科学家们要在飞船中度过相当长的一段时间,小联提议用扑克牌打发长途旅行中的无聊时间.玩了几局之后,大家觉得单纯玩扑克牌对于像他们这样的高智商人才来说太简单了.有人提出了扑克牌的一种新的玩法. 对于扑克牌的一次洗牌是这样定义的,将一叠N(N为偶数)张扑克牌平均分成上下两叠,取下面一叠的第一张作为新的一叠的第一张,然后取上面一叠的第一张作为新的一叠的第二张,再取