首页 > 解决方案 > 如何通过 Java 中的随机过程生成对象的唯一值

问题描述

我想通过随机生成电影对象的唯一值。我写了一个代码片段,但我不确定所有值都不能通过使用Random().

我怎样才能通过这个过程来产生所有这些独特的价值?

这是我的代码片段,如下所示。

private static ArrayList<Movie> addMovies(ArrayList<Movie> movieList) {

        for(int i=0;i<20;i++) {
            Movie movie = new Movie();
            movie.setId(defineMovieId());
            movie.setTitle(defineMovieName(15));
            movieList.add(movie);
        }       

        return movieList;
    }


    public static String defineMovieName(int n) { 

        // chose a Character random from this String 
        String AlphaNumericString = "ABCÇDEFGHIİJKLMNOÖPQRSŞTUÜVWXYZ"
                                    + "abcçdefghıijklmnoöpqrsştuüvxyz"; 

        StringBuilder sb = new StringBuilder(n); 

        for (int i = 0; i < n; i++) { 

            int index 
                = (int)(AlphaNumericString.length() 
                        * Math.random()); 

            sb.append(AlphaNumericString 
                          .charAt(index)); 
        } 

        return sb.toString(); 
    } 

    public static long defineMovieId() {
        int max = 1000;
        int min = 1;
        int range = max - min + 1;
        int res = (int) ( Math.random()*range) + min;
        return res; 
    }

标签: javaobjectrandom

解决方案


您定义的方法不保证随机 ID 或随机名称。对于保证唯一值,您可以执行以下操作:

  1. 对于唯一 ID:创建类型static变量AtomicLong并使用 getAndIncrement()
  2. 对于唯一名称:使用UUID.randomUUID()

    演示:

    import java.util.UUID;
    import java.util.concurrent.atomic.AtomicLong;
    
    public class Main {
        static final long INITIAL_VALUE = 1000000;
        static AtomicLong atomicLong = new AtomicLong(INITIAL_VALUE);
    
        public static void main(String[] args) {
            // Tests
            System.out.println("10 random IDs:");
            for (int i = 1; i <= 10; i++) {
                System.out.print(defineMovieId() + " ");
            }
    
            System.out.println();
    
            System.out.println("10 random movie names:");
            for (int i = 1; i <= 10; i++) {
                System.out.print(defineMovieName() + " ");
            }
        }
    
        public static long defineMovieId() {
            return atomicLong.getAndIncrement();
        }
    
        public static String defineMovieName() {
            return UUID.randomUUID().toString().replace("-", "");
        }
    }
    

    输出:

    10 random IDs:
    1000000 1000001 1000002 1000003 1000004 1000005 1000006 1000007 1000008 1000009 
    10 random movie names:
    0c77d209fb624415af7100c3184b35a6 1262e50b680f4a738a607ff757f2b510 7b93c73d93b34db88fc99d1096c1ce84 cbb9c6c90fb8489dbd9c52d4ebdc2ca3 9ba1d409b32b4c55a7562d714aadc220 ec40b647f33a4fc6becc8c5741eb8bf7 c1fbb7bb77d1417c86c2064039f62dec 82b52fdae1d24602b5ee9becd73ba3ce 2d82d481282b4684b55c168e9d216f36 27b02bf63b054d32a0e43992a5fcb124 
    

推荐阅读