所以我制作了这个程序,我希望它不能创建只有黑白的8 x 8大小的图像,但是它只显示白色,而不是随机分布黑白。这是我的代码。如果有人可以帮助,那就太好了:D
package de.gamingengine.main;
import java.awt.Color;
import java.awt.image.BufferedImage;
import java.io.IOException;
import java.io.File;
import javax.imageio.ImageIO;
public class Main {
public static void main(String args[])throws IOException {
int width = 8;
int height = 8;
Color c = null;
BufferedImage img = new BufferedImage(width, height, BufferedImage.TYPE_INT_ARGB);
File f = null;
for(int y = 0; y < height; y++) {
for(int x = 0; x < width; x++) {
int blackorwhite = (int)Math.random()*10;
if(blackorwhite >= 5) {
c = Color.BLACK;
} else if(blackorwhite < 5){
c = Color.WHITE;
}
img.setRGB(x, y, c.getRGB());
}
}
try {
f = new File("C:\\Users\\Linus\\Desktop\\Out.png");
ImageIO.write(img, "png", f);
} catch (IOException e) {
System.out.println("Error: " + e);
}
}
}
答案 0 :(得分:3)
问题是运算符的优先级。在这里:
(int) Math.random() * 10
首先,您需要将Math.random()
的结果强制转换为int
。由于此方法从[0,1)
返回值,因此将其强制转换为int
,因此它始终为0,然后将其乘以10,但最后仍为0。
将代码更改为:
int blackorwhite = (int) (Math.random() * 10);
答案 1 :(得分:1)
乘法后转换为整数:
(int)(Math.random()*11)
int range = (max - min) + 1; return (int)(Math.random() * range) + min;
答案 2 :(得分:0)
尽管所有提及操作符优先级的答案以及强制转换必须在完整表达式上使用的答案都是正确的,但我想指出对于这种特定情况,有一个更好的选择:
改为使用Random.nextInt(int bound)
。
它返回[0...bound>
范围内的伪随机数。由于偏差较小,因此此方法为more efficient and mathematically more correct(但我怀疑这对您的用例会有很大影响)。
Random random = new Random();
for (int y = 0; y < height; y++) {
for (int x = 0; x < width; x++) {
int blackorwhite = random.nextInt(10); // Look, no cast
// Rest of the code as-is
...
}
}
PS:我认为,如果您仅使用nextInt(2)
或nextBoolean()
,您的代码将更加清晰。