Javaプログラミングは所与の範囲内のランダムなN個の重複しない数からランダムな数を生成する方法の小結を実現する

4631 ワード

この例では,Javaプログラミングが所与の範囲内のランダムN個の重複しない数からランダム数を生成する方法を実装する.皆さんの参考にしてください.具体的には以下の通りです.
一、JAVAで乱数を生成する方式
1.j 2 seにMathを用いる.random()はシステムに0~1の間のdoubleタイプの小数をランダムに選択させ、それを1つの数、例えば25を乗じると、j 2 meにない0~25の範囲の乱数を得ることができる.

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クラスは乱数発生器を生成し、これも私たちがj 2 meのプログラムでよく使う乱数を取る方法です.これには、Random()とRandom(long seed)の2つの形式の構造関数があります.Random()は、現在時刻であるSystemを用いる.CurrentTimeMillis()はジェネレータのシードとして,Random(long seed)は指定したseedをジェネレータのシードとして使用する.乱数発生器(Random)オブジェクトが生成された後、異なるmethod:nextInt()、nextLong()、nextFloat()、nextDouble()などを呼び出すことで、異なるタイプの乱数が得られる.2つの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、方法2:HashSetの特徴を利用して、異なる値しか保存できない

/**
 *        N      
 *   HashSet   ,        
 * @param min        
 * @param max        
 * @param n      
 * @param HashSet set       
*/
public static void randomSet(int min, int max, int n, HashSet 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、方法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 set = new HashSet();
  randomSet(20,50,10,set);
    for (int j : set) {
    System.out.println(j);
  }
}


PS:ここでは、2つの関連オンラインツールを提供しています.
オンライン乱数/文字列生成ツール:http://tools.jb51.net/aideddesign/suijishu
高強度パスワードジェネレータ:http://tools.jb51.net/password/CreateStrongPassword
本文で述べたjavaプログラム設計に役立つことを願っています.