Java编程实现从给定范围内随机N个不重复数生成随机数的方法小结

本文实例讲述了Java编程实现从给定范围内随机N个不重复数生成随机数的方法。分享给大家供大家参考,具体如下:

一、JAVA中生成随机数的方式

1、在j2se中使用Math.random()令系统随机选取一个0~1之间的double类型小数,将其乘以一个数,比如25,就能得到一个0~25范围内的随机数,这个在j2me中没有;

int randomNumber = (int) Math.round(Math.random()*(max-min)+min);

2、在System类中有一个currentTimeMillis()方法,这个方法返回从1970年1月1号0点0分0秒到目前的一个long型的毫秒数,可作为一个随机数,还可以将其对某些数取模,就能限制随机数的范围;此方式在循环中同时产生多个随机数时,会是相同的值,有一定的局限性!

long randomNum = System.currentTimeMillis();
int randomNumber = (int) randomNum%(max-min)+min;

3、使用java.util.Random类来产生一个随机数发生器,这个也是我们在j2me的程序里经常用的一个取随机数的方法。它有两种形式的构造函数,分别是Random()和Random(long seed)。Random()使用当前时间即System.currentTimeMillis()作为发生器的种子,Random(long seed)使用指定的seed作为发生器的种子。随机数发生器(Random)对象产生以后,通过调用不同的method:nextInt()、nextLong()、nextFloat()、nextDouble()等获得不同类型随机数。 如果两个Random对象使用相同的种子(比如都是25),并且以相同的顺序调用相同的函数,那它们返回值完全相同。

Random random = new Random();
int randomNumber = random.nextInt(max)%(max-min+1) + min;

二、随机给定范围内N个不重复的数

1、方法一:最简单最易理解的两重循环去重

/**
 * 随机指定范围内N个不重复的数
 * 最简单最基本的方法
 * @param min 指定范围最小值
 * @param max 指定范围最大值
 * @param n 随机数个数
*/
public static int[] randomCommon(int min, int max, int n){
  if (n > (max - min + 1) || max < min) {
      return null;
    }
  int[] result = new int[n];
  int count = 0;
  while(count < n) {
    int num = (int) (Math.random() * (max - min)) + min;
    boolean flag = true;
    for (int j = 0; j < n; j++) {
      if(num == result[j]){
        flag = false;
        break;
      }
    }
    if(flag){
      result[count] = num;
      count++;
    }
  }
  return result;
}

2、方法二:利用HashSet的特征,只能存放不同的值

/**
 * 随机指定范围内N个不重复的数
 * 利用HashSet的特征,只能存放不同的值
 * @param min 指定范围最小值
 * @param max 指定范围最大值
 * @param n 随机数个数
 * @param HashSet<Integer> set 随机数结果集
*/
public static void randomSet(int min, int max, int n, HashSet<Integer> set) {
    if (n > (max - min + 1) || max < min) {
      return;
    }
    for (int i = 0; i < n; i++) {
      // 调用Math.random()方法
      int num = (int) (Math.random() * (max - min)) + min;
      set.add(num);// 将不同的数存入HashSet中
    }
    int setSize = set.size();
    // 如果存入的数小于指定生成的个数,则调用递归再生成剩余个数的随机数,如此循环,直到达到指定大小
    if (setSize < n) {
    randomSet(min, max, n - setSize, set);// 递归
    }
}

3、方法三:排除已随机到的数

/**
 * 随机指定范围内N个不重复的数
 * 在初始化的无重复待选数组中随机产生一个数放入结果中,
 * 将待选数组被随机到的数,用待选数组(len-1)下标对应的数替换
 * 然后从len-2里随机产生下一个随机数,如此类推
 * @param max 指定范围最大值
 * @param min 指定范围最小值
 * @param n 随机数个数
 * @return int[] 随机数结果集
 */
public static int[] randomArray(int min,int max,int n){
  int len = max-min+1;
  if(max < min || n > len){
    return null;
  }
  //初始化给定范围的待选数组
  int[] source = new int[len];
    for (int i = min; i < min+len; i++){
    source[i-min] = i;
    }
    int[] result = new int[n];
    Random rd = new Random();
    int index = 0;
    for (int i = 0; i < result.length; i++) {
    //待选数组0到(len-2)随机一个下标
      index = Math.abs(rd.nextInt() % len--);
      //将随机到的数放入结果集
      result[i] = source[index];
      //将待选数组中被随机到的数,用待选数组(len-1)下标对应的数替换
      source[index] = source[len];
    }
    return result;
}

调用实例:

public static void main(String[] args) {
  int[] reult1 = randomCommon(20,50,10);
  for (int i : reult1) {
    System.out.println(i);
  }
  int[] reult2 = randomArray(20,50,10);
  for (int i : reult2) {
    System.out.println(i);
  }
  HashSet<Integer> set = new HashSet<Integer>();
  randomSet(20,50,10,set);
    for (int j : set) {
    System.out.println(j);
  }
}

PS:这里再为大家提供两款相关在线工具供大家参考使用:

在线随机数字/字符串生成工具:
http://tools.jb51.net/aideddesign/suijishu

高强度密码生成器:
http://tools.jb51.net/password/CreateStrongPassword

希望本文所述对大家java程序设计有所帮助。

(0)

相关推荐

  • 史上最全的java随机数生成算法分享

    复制代码 代码如下: String password = RandomUtil.generateString(10); 源码如下: 复制代码 代码如下: package com.javaniu.core.util;import java.util.Random;public class RandomUtil { public static final String ALLCHAR = "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRS

  • 如何用java生成指定范围的随机数

    要生成在[min,max]之间的随机整数, package edu.sjtu.erplab.io; import java.util.Random; public class RandomTest { public static void main(String[] args) { int max=20; int min=10; Random random = new Random(); int s = random.nextInt(max)%(max-min+1) + min; System.

  • Java生成10个1000以内的随机数并用消息框显示数组内容然后求和输出

    本文最终结果大概是这样的,使用java技术随机生成10个数,然后填充一个数组并在消息框中显示数组内容,接着对数组求和输出,将结果显示在消息框中. 设计思路:可以先用Math.Random()*1000生成1000以内随机数,然后依次存入数组中,然后读取数组,输出随机数,同时进行加法计算,最后将所有结果以消息框形式输出. 程序流程图: 源代码: package 随机数求和; import javax.swing.*; public class Sum { public static void ma

  • java生成指定范围随机数的多种代码

    生成指定范围内的随机数这个是最常用的技术之一,程序员希望通过随机数的方式来处理众多的业务逻辑,测试过程中也希望通过随机数的方式生成包含大量数字的测试用例. 问题往往类似于: 如何随机生成 1~100 之间的随机数,取值包含边界值 1 和 100. 或者是: 如何随机生成随机的3位整数? 等等-- 以 Java 语言为例,我们观察其 Random 对象的 nextInt(int) 方法,发现这个方法将生成 0 ~ 参数之间随机取值的整数.例如(假设先有 Random rand = newRando

  • 浅谈Java中随机数的几种实现方式

    众所周知,随机数是任何一种编程语言最基本的特征之一.而生成随机数的基本方式也是相同的:产生一个0到1之间的随机数.看似简单,但有时我们也会忽略了一些有趣的功能. 我们从书本上学到什么? 最明显的,也是直观的方式,在Java中生成随机数只要简单的调用: java.lang.Math.random() 在所有其他语言中,生成随机数就像是使用Math工具类,如abs, pow, floor, sqrt和其他数学函数.大多数人通过书籍.教程和课程来了解这个类.一个简单的例子:从0.0到1.0之间可以生成

  • 浅谈Java中的n种随机数产生办法

    我们从书本上学到什么? 最明显的,也是直观的方式,在Java中生成随机数只要简单的调用: java.lang.Math.random() 在所有其他语言中,生成随机数就像是使用Math工具类,如abs, pow, floor, sqrt和其他数学函数.大多数人通过书籍.教程和课程来了解这个类.一个简单的例子:从0.0到1.0之间可以生成一个双精度浮点数.那么通过上面的信息,开发人员要产生0.0和10.0之间的双精度浮点数会这样来写: Math.random() * 10 而产生0和10之间的整数

  • Java生产1-100的随机数简单实例(分享)

    直接调用Math里面的random即可,简单方便 int i = (int)(Math.random()*100+1); 以上这篇Java生产1-100的随机数简单实例(分享)就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持我们.

  • Java编程实现从给定范围内随机N个不重复数生成随机数的方法小结

    本文实例讲述了Java编程实现从给定范围内随机N个不重复数生成随机数的方法.分享给大家供大家参考,具体如下: 一.JAVA中生成随机数的方式 1.在j2se中使用Math.random()令系统随机选取一个0~1之间的double类型小数,将其乘以一个数,比如25,就能得到一个0~25范围内的随机数,这个在j2me中没有: int randomNumber = (int) Math.round(Math.random()*(max-min)+min); 2.在System类中有一个current

  • Python内置random模块生成随机数的方法

    本文我们详细地介绍下两个模块关于生成随机序列的其他使用方法. 随机数参与的应用场景大家一定不会陌生,比如密码加盐时会在原密码上关联一串随机数,蒙特卡洛算法会通过随机数采样等等.Python内置的random模块提供了生成随机数的方法,使用这些方法时需要导入random模块. import random 下面介绍下Python内置的random模块的几种生成随机数的方法. 1.random.random()随机生成 0 到 1 之间的浮点数[0.0, 1.0).注意的是返回的随机数可能会是 0 但

  • Java中使用WebUploader插件上传大文件单文件和多文件的方法小结

    一.使用webuploader插件的原因说明 被现在做的项目坑了. 先说一下我的项目架构spring+struts2+mybatis+MySQL 然后呢.之前说好的按照2G上传就可以了,于是乎,用了ajaxFileUpload插件,因为之前用图片上传也是用这个,所以上传附件的时候就直接拿来用了 各种码代码,测试也测过了,2G文件上传没问题,坑来了,项目上线后,客户又要求上传4G文件,甚至还有20G以上的..纳尼,你不早说哦... 在IE11下用ajaxFileUpload.js插件上传超过4G的

  • JAVA 根据设置的概率生成随机数的方法

    本文介绍了JAVA 根据设置的概率生成随机数的方法,分享给大家 import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.Random; public class RandomTest { // String 可以为任意类型 也可以自定义类型 static Map<String, Integer> keyChanceMap

  • Java编程实现生成给定范围内不重复随机数的方法小结

    本文实例总结了Java编程实现生成给定范围内不重复随机数的方法.分享给大家供大家参考,具体如下: 在Java中的Math类中存在一个random()方法,该方法默认生成0.0到1.0之间的double型随机数:经过稍微处理,就可以产生我们需要的随机数以及随机字符. 除了Math类中的random()方法之外,java.util.Random类也可以用来生成随机数:下面分别举例(用不同的方法生成双色球号码)说明: 1. Math.random()方法 生成随机数: package test; im

  • Java运行时动态生成对象的方法小结

    目录 一.利用JDK自带工具类实现 二.利用三方Jar包实现 三.利用Groovy脚本实现 最近一个项目中利用规则引擎,提供用户拖拽式的灵活定义规则.这就要求根据数据库数据动态生成对象处理特定规则的逻辑.如果手写不仅每次都要修改代码,还要每次测试发版,而且无法灵活根据用户定义的规则动态处理逻辑.所以想到将公共逻辑写到父类实现,将特定逻辑根据字符串动态生成子类处理.这就可以一劳永逸解决这个问题. 那就着手从Java如何根据字符串模板在运行时动态生成对象. Java是一门静态语言,通常,我们需要的c

  • Java生成随机数的方法

    1.通过System.currentTimeMillis()来获取一个当前时间毫秒数的long型数字. long a = System.currentTimeMillis(); System.out.println(a); 2.通过Math.random()返回一个0到1之间的double值. int b = (int)(Math.random()*99+1); System.out.println(b); 3.通过Random类来产生一个随机数. Random random = new Ran

  • Java编程一个随机数产生模块代码分享

    java随机数的产生比较简单,可以通过 Random rand = new Random(47); System.out.println(rand.nextInt()); 产生,也可以通过以下产生: double d = Math.random(); 当然代码中前者由于使用了固定的种子47,所以每次的值都是一样的,也可以使用 Random rand = new Random(); System.out.println(rand.nextInt()); 而对于代码2则产生的是double的随机数.

  • Java中生成随机数的4种方式与区别详解

    目录 在 Java 中,生成随机数的场景有很多,所以本文我们就来盘点一下 4 种生成随机数的方式,以及它们之间的区别和每种生成方式所对应的场景. 1.Random Random 类诞生于 JDK 1.0,它产生的随机数是伪随机数,也就是有规则的随机数.Random 使用的随机算法为 linear congruential pseudorandom number generator (LGC) 线性同余法伪随机数.在随机数生成时,随机算法的起源数字称为种子数(seed),在种子数的基础上进行一定的

  • php获取一定范围内取N个不重复的随机数

    本文实例讲述了php获取一定范围内取N个不重复的随机数的方法.分享给大家供大家参考,具体如下: //range 是将1000到9999 列成一个数组 $numbers = range (1000,9999); //shuffle 将数组顺序随即打乱 shuffle ($numbers); //array_slice 取该数组中的某一段 $result = array_slice($numbers,0,3); print_r($result); 运行结果为: Array ( [0] => 9767

随机推荐