You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

求助:使用SecureRandom生成多个随机图形失败的解决办法

解决多随机图形生成的问题

嘿,我明白你的问题啦!你现在的核心问题是把随机值的生成逻辑放到了for循环外面——也就是说整个循环过程中,r的值从始至终都是同一个固定值,所以不管循环跑多少次,只会画出同一种图形(要么全是矩形,要么全是椭圆)。

下面给你具体的实现思路和代码示例:

核心修复思路

  • 把随机值生成移到循环内部:每次循环迭代时,重新生成一个新的随机值,这样每次都能随机决定画矩形还是椭圆。
  • 优化随机值范围:你用RC.nextInt()会生成整个int区间的随机数,建议改成RC.nextInt(2),这样只会生成0或1两个值,完美匹配你的二选一逻辑,更直观也更高效。

示例代码

@Override
protected void paintComponent(Graphics g) {
    super.paintComponent(g);
    // 可以把SecureRandom实例声明为类成员变量,不用每次在paintComponent里新建,更高效
    SecureRandom RC = new SecureRandom();
    
    // 假设要生成15个随机图形,你可以自己调整数量
    for (int i = 0; i < 15; i++) {
        // 关键:每次循环都生成新的随机值
        int r = RC.nextInt(2); // 生成0(矩形)或1(椭圆)
        
        // 额外生成随机的位置和大小,让图形分散开不重叠
        int x = RC.nextInt(getWidth() - 60);
        int y = RC.nextInt(getHeight() - 60);
        int width = 20 + RC.nextInt(40);
        int height = 20 + RC.nextInt(40);
        
        if (r == 0) {
            g.drawRect(x, y, width, height);
        } else {
            g.drawOval(x, y, width, height);
        }
    }
}

额外小提示

如果你的图形数量比较多,建议把SecureRandom RC = new SecureRandom();声明为类的成员变量(比如在类的顶部定义),而不是每次调用paintComponent时都新建实例,这样能避免重复初始化带来的性能损耗,随机值的生成逻辑依然要放在循环内部哦。

内容的提问来源于stack exchange,提问作者Plouton

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.22 08:07:11