加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Java > 正文

java – 在每次调用时生成唯一的随机数

发布时间:2020-12-15 02:02:16 所属栏目:Java 来源:网络整理
导读:在一次采访中,我被要求提供一种方法,每次调用它时都会生成唯一的5位数随机数.例如:如果我调用方法得到22222,那么在下次通话中我不应该得到22222. 我写了一个代码如下: import java.util.ArrayList;import java.util.Collections;import java.util.Scanner;
在一次采访中,我被要求提供一种方法,每次调用它时都会生成唯一的5位数随机数.例如:如果我调用方法得到22222,那么在下次通话中我不应该得到22222.

我写了一个代码如下:

import java.util.ArrayList;
import java.util.Collections;
import java.util.Scanner;

public class RandomNumberGen {


    private static ArrayList arr=new ArrayList();
    private static int k=-1;
    public RandomNumberGen(){
        for (int i=10000;i<99999;i++){
            arr.add(i);
        }
        Collections.shuffle(arr);
    }
    public static void main(String[] args) {
        for(int m=0;m<10;m++){
            try {
                System.out.println(new RandomNumberGen().randomNumbermethod());
            } catch (Exception e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
        }


    }
    public Integer randomNumbermethod() throws Exception{
        k++;
        if(k>=arr.size()){
            throw new Exception("No more number available");
        }else return (Integer) arr.get(k);
    }

}

答案被接受但我被要求现在避免记忆浪费.
?我的问题在这里,因为你可以看到我只使用了10个数字.所以arraylist占用的剩余空间是一个记忆 – 浪费.有一种方法我可以实现同样的事情而不需要额外的记忆.
????我的意思是在某种程度上使用哪个唯一编号可以在每次调用时生成,这样就不会浪费这么多内存.

解决方法

您的方法确实非常适合创建大量唯一值,但是如果您只创建少量唯一值,则可以更有效地简单地跟踪使用的值以保证唯一性

import java.util.Collection;
import java.util.HashSet;
import java.util.Random;

public class UniqueRandom {

    static Random rnd=new Random();

    public static void main(String args[]){
        Collection<Integer> alreadyChosen = new HashSet<Integer>();
        for(int i=0;i<10;i++){
            System.out.println(getNextUniqueRandom (alreadyChosen));
        }
    }


    public static int getNextUniqueRandom(Collection<Integer> alreadyChosen){
        if (alreadyChosen.size()==90000){ //hardcoded 5 figure numbers,consider making a variable
             throw new RuntimeException("All 5 figure IDs used");
        }


        boolean unique=false;
        int value=0;
        while(unique==false){
            value=rnd.nextInt(90000)+10000;
            unique=!alreadyChosen.contains(value);
        }
        alreadyChosen.add(value);
        return value;
    }

}

当只需要一小部分可用范围时,这种方法非常有效,但随着碰撞变得更加普遍,这种方法变得越来越慢.您应该选择的确切实现在很大程度上取决于您需要获得多少值.

要考虑的注意事项

>正如已经说过的那样,随着更多的值,这将变得非常缓慢选择,应该向最终用户明确,甚至更好;经过这么多次调用后改变算法

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读