Я хотел сделать генератор случайных изображений, но он не работает - PullRequest
0 голосов
/ 30 июня 2019

Итак, я создал эту программу и хотел, чтобы она создала изображение размером 8 на 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);

        }

    }

}

Ответы [ 3 ]

3 голосов
/ 30 июня 2019

Проблема в приоритете операторов.Здесь:

(int) Math.random() * 10

Сначала вы приведете результат от Math.random() к int.Поскольку этот метод возвращает значения из [0,1), вы приводите его к int, поэтому он всегда равен 0, а затем умножаете его на 10, но в конце концов все равно 0.

Измените код на:

int blackorwhite = (int) (Math.random() * 10);
1 голос
/ 30 июня 2019

Приведение к int после умножения:

(int)(Math.random()*11)

См. Случайно с диапазоном

 int range = (max - min) + 1;     
    return (int)(Math.random() * range) + min;
0 голосов
/ 01 июля 2019

Хотя все ответы с указанием приоритета оператора и того, что приведение должно быть в полном выражении, верны, я хотел бы отметить, что для этого конкретного случая есть лучший вариант:

Использовать Random.nextInt(int bound)вместо.

Возвращает псевдослучайное число в диапазоне [0...bound>.Этот метод более эффективен и математически более корректен из-за меньшего смещения (но я сомневаюсь, что это имеет большое значение для вашего случая использования).

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().

...