java 生成不同随机数_Java产生不同的随机数

这篇博客介绍了在Java中生成不重复随机数的三种策略:1) 使用LinkedHashSet或TreeSet创建无序或有序的随机数集合;2) 通过交换数组元素生成随机序列;3) 应用Knuth算法按概率选择随机数。这些方法在各种场景下都可以灵活运用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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

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

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

3、Knuth算法,主要思想是从r个剩余的整数中选出s个,以概率s/r选择下一个数,  rand()%remaining

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

/**

* 总结几种产生不同随机数的方法

* 1、使用Java的Set集合来产生,无序LinkedHashSet,有序TreeSet

* 2、数组交换

* 3、bigrand()%remain

*/

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 linkedHashSet=new LinkedHashSet();

System.out.print("LinkedHashSet:");

while(linkedHashSet.size()<6)

linkedHashSet.add(random.nextInt(10));

System.out.println(linkedHashSet);

//TreeSet排序的无重复随机数

System.out.print("TreeSet:");

TreeSet treeSet=new TreeSet();

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

for(int i=0;i<10;i++)

{

if(random.nextInt()%(10-i)

{

array[maxNumber]=i;

System.out.print(array[maxNumber]+" ");

maxNumber--;

}

}

}

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值