Java产生不同的随机数

  产生不同的随机数,转化一下更类似于随机取样的问题,从N个不重复的数中,取出m个数。

  1、使用java的Set集合,Set保证新增的元素不能与集合中已有的元素重复;LinkedHashSet、TreeSet都能实现,后者集合里的元素按升序排列;

  2、用数组保存N个值,然后打乱数组,取前m个数;

  3、Knuth算法,主要思想是从r个剩余的整数中选出s个,以概率s/r选择下一个数,  rand()%remaining<select,当条件符合时,select自减1,而remaining是不断减小的。

当remaining==select时,不等式必然成立,肯定会选择一个数;而当select变为0时,等式必然不成立;所以一定会选出select个数,而且是递增有序的

/**
 * 总结几种产生不同随机数的方法
 * 1、使用Java的Set集合来产生,无序LinkedHashSet,有序TreeSet
 * 2、数组交换
 * 3、bigrand()%remain<select来选择,
 */
package codeant.random;

import java.util.LinkedHashSet;
import java.util.Random;
import java.util.TreeSet;

public class DiffRandom {
	public static void Swap(int []a,int i,int j)
	{
		int temp=a[i];a[i]=a[j];a[j]=temp;
	}
	
	public static void main(String []args){
		Random random=new Random(System.currentTimeMillis());
		int maxNumber=6;
		System.out.println("测试,产生"+maxNumber+"个不同随机数1~10");	
		//LinkdedHashSet
		LinkedHashSet<Integer> linkedHashSet=new LinkedHashSet<Integer>();
		System.out.print("LinkedHashSet:");
		while(linkedHashSet.size()<6)
			linkedHashSet.add(random.nextInt(10));
		System.out.println(linkedHashSet);
		//TreeSet排序的无重复随机数
		System.out.print("TreeSet:");
		TreeSet<Integer> treeSet=new TreeSet<Integer>();
		while(treeSet.size()<6)
			treeSet.add(random.nextInt(10));
		System.out.println(treeSet);
		//交换数组的方法,首先初始化
		int []array=new int [10];
		for(int i=0;i<10;i++)
			array[i]=i;
		for(int i=0;i<5;i++)
			Swap(array, i, random.nextInt(10-i-1));
		System.out.print("Array:");
		for(int i=0;i<6;i++)
			System.out.print(array[i]+" ");
		//Knuth算法
		
		System.out.print("\nbigrand()%remain<select:");
		for(int i=0;i<10;i++)
		{
			if(random.nextInt()%(10-i)<maxNumber)
			{
				array[maxNumber]=i;
				System.out.print(array[maxNumber]+" ");
				maxNumber--;
			}
			
		}
		
	}	
}

  

posted on 2012-11-02 11:01  CodeAnt  阅读(997)  评论(0编辑  收藏  举报