随机产生N个不重复数

本文探讨了一种有效的随机数生成与去重算法,利用线性特性与伪随机数生成,结合RSA算法的安全特性,确保随机数的唯一性和安全性。通过数组或HashSet判断重复,提高效率并降低重复概率。此外,提出了一种改进的随机数生成方法,通过在每次随机前去除已生成的数,避免重复,适用于需要大量不重复随机数的场景。

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

一、完美想法

b = f(a);

a是线性的,而b是唯一,而且看起来是伪随机的。

其中函数f,有个是RSA算法的函数。

二、排除重复

      先生成随机数,并用个数组等进行置位或者用HashSet判断为重复与非重复。

      if(Arr[rand] == 1)   说明已经生产了这个数,然后继续生产下个随机数。用部分空间保存之前状态,判断次数减少为一次。

      但这个有可能一直生产重复的数,数据多了,重复的概率大。

三、下次随机时候,去掉前面的随机数。

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];  
           //去掉随机到的数,同时把可以随机的index减少一个。 
           source[index] = source[len];  
       }  
       return result;  
}  

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值