求助:使用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
相关产品推荐
相关产品推荐

