记一次JAVA中的Random使用经验

项目中遇到这样一个需求,在信息流中拉取其他源的新闻,每次大概会拉取到10条,其中有些是没有标题或者标题不符合规范的,需要对这种的标题进行识别并替换,随机替换为预先设置的大概5个默认标题中的一个。需求简单,核心在于随机选取,一下就想到了Random类,遍历每次的10条新闻,判断为需要替换标题时用Random随机索引,从5个默认标题中随机选取标题替换,起初代码逻辑大概如下。

import java.util.Arrays;
import java.util.Random;

public class TestRandom {

    private static String[] titles = {"1-title","2-title","3-title","4-title","5-title"};
    private static String[] news = new String[10];

    public static void main(String[] args) {
        for(int i = 0; i < 10; i++){
            Random random = new Random(System.currentTimeMillis());
            int index = random.nextInt(titles.length);
            news[i] = titles[index];
        }
        System.out.println(Arrays.toString(news));
    }
}

一切都感觉挺好,但是发现每次拉取到的新闻被替换后都是选用同一个默认标题,上述代码的一次运行结果为[2-title, 2-title, 2-title, 2-title, 2-title, 2-title, 2-title, 2-title, 2-title, 2-title],问题出在哪里呢。唯一的可能就是每次都随机到了同一个索引,通过加一些Log发现循环过程中,每回System.currentTimeMillis()返回的时间戳是完全相同的,该函数返回的是毫秒,对于计算机来说,1ms能干的事太多了,一个for循环用的时间还不到1ms,这就导致了Random的种子是相同的,Random每次返回的随机序列也就会相同,从而导致选中同一个标题。

解决方法也很简单,那就是避免Random种子相同,可以把Random random = new Random(System.currentTimeMillis());这句从循环中提取出去,修改后代码如下。

import java.util.Arrays;
import java.util.Random;

public class TestRandom {

    private static String[] titles = {"1-title","2-title","3-title","4-title","5-title"};
    private static String[] news = new String[10];
    privat static Random random = new Random();

    public static void main(String[] args) {
        for(int i = 0; i < 10; i++){
            int index = random.nextInt(titles.length);
            news[i] = titles[index];
        }
        System.out.println(Arrays.toString(news));
    }

如此便解决了问题。可以看到,这次随机时干脆就没有用到种子了。种子其实就是为了保证每次随机出来的随机数序列是不同的,而在上述的需求中不需要设置种子。

其实这是一个很简单的问题,写此博就是为了记录一下自己的一次踩坑经历,当然如果能给新手一些启发就更好了。

你可能感兴趣的:(Java)