记一次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));
    }

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

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

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,以下是Java Swing实现的猜数字游戏示例代码: ```java import java.awt.*; import java.awt.event.*; import javax.swing.*; public class GuessNumberGame extends JFrame { private JLabel label; private JTextField textField; private JButton button; private int number = (int) (Math.random() * 100) + 1; private int count = 0; public GuessNumberGame() { setTitle("猜数字游戏"); setSize(400, 150); setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); setLayout(new FlowLayout()); label = new JLabel("请输入1-100之间的整数:"); textField = new JTextField(10); button = new JButton("确定"); add(label); add(textField); add(button); button.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { int guess = Integer.parseInt(textField.getText()); count++; if (guess == number) { JOptionPane.showMessageDialog(null, "恭喜你猜对了!你猜了" + count + "次。"); dispose(); } else if (guess < number) { JOptionPane.showMessageDialog(null, "你猜的数字小了,请再试一次。"); } else { JOptionPane.showMessageDialog(null, "你猜的数字大了,请再试一次。"); } textField.setText(""); } }); setVisible(true); } public static void main(String[] args) { new GuessNumberGame(); } } ``` 该程序使用JFrame创建一个窗口,包含一个标签、一个文本框和一个按钮。用户在文本框输入数字后,单击按钮以提交猜测。程序会告诉用户猜的数字是太大还是太小,直到用户猜对为止。程序还会录用户猜测的次数,并在用户猜对后告诉他们猜了多少次。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值