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); } } 答案被接受但我被要求现在避免记忆浪费. 解决方法
您的方法确实非常适合创建大量唯一值,但是如果您只创建少量唯一值,则可以更有效地简单地跟踪使用的值以保证唯一性
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; } } 当只需要一小部分可用范围时,这种方法非常有效,但随着碰撞变得更加普遍,这种方法变得越来越慢.您应该选择的确切实现在很大程度上取决于您需要获得多少值. 要考虑的注意事项 >正如已经说过的那样,随着更多的值,这将变得非常缓慢选择,应该向最终用户明确,甚至更好;经过这么多次调用后改变算法 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |