Math#random не так уж и случайен?

Я обнаружил, что с моей программой происходит что-то странное.

Эта программа в основном используется для щелчка по компонентам, поскольку она предназначена для проверки случайности.

enter image description here

Как видите, он печатается правильно, так как должен иметь тенденцию щелкать ближе к середине, что идеально.

Проблема в том, что это кажется предвзятым.

import java.applet.Applet;
import java.awt.Point;
import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.ArrayList;
import java.awt.*;

public class Testing extends Applet {

/**
 * 
 */
private static final long serialVersionUID = -2441995094105327849L;

public void init() {
    setSize(WIDTH, HEIGHT);
    img = createImage(WIDTH, HEIGHT);
    g = img.getGraphics();
    paint(g);
    setVisible(true);
    g.setColor(new Color(0, 0, 0));
    g.fillRect(0, 0, WIDTH, HEIGHT);
    g.setColor(new Color(55, 55, 55, 55));
    main();
}

public final static int WIDTH = 400, HEIGHT = 400;
public static int[] widths = new int[WIDTH], heights = new int[HEIGHT];
public static ArrayList<String> set = new ArrayList<String>();
public Image img;
public Graphics g;

public void paint(Graphics g) {
    g.drawImage(img, 0, 0, null);
}

public void update(Graphics g) {
    paint(g);
}

public void main() {
    int count101 = 0;
    int count100 = 0;
    int count99 = 0;
    try {
        PrintWriter pw = new PrintWriter(new FileWriter(
                new File("Data.dat")));
        Point center = new Point(WIDTH / 2, HEIGHT / 2);

        int runs = 10000000;

        for (int i = 0; i < runs; i++) {
            int x = center.x
                    - (int) ((Math.random() - Math.random())
                            * Math.random() * center.x);
            int y = center.y
                    - (int) ((Math.random() - Math.random())
                            * Math.random() * center.y);
            widths[x]++;
            heights[y]++;
            repaint();
            g.fillRect(x, y, 1, 1);
            if((x & y) == 101){
                count101++;
            }
            if((x & y) == 100){
                count100++;
            }
            if((x & y) == 99){
                count99++;
            }
        }
        System.out.println(count101);
        System.out.println(count100);
        System.out.println(count99);
        repaint();
        pw.flush();
        pw.close();
    } catch (IOException e) {
        e.printStackTrace();
    }
}
}

Постоянно выводятся необъективные результаты.

Он напечатает следующее:

3640
10918
3741

Это значительно смещено, потому что по большей части следует тренду, следуя линейному увеличению со всеми другими значениями, но как только оно достигает отметки 100, оно решает, что будет падать. бомбу и подобрать ее на 6% больше, чем любой другой.

Кто-нибудь знает причину этого?

Да, кстати, у меня есть текстовый файл, содержащий каждый результат, распечатанный с повторением 10 000 000 раз с процентами и т. д., он довольно длинный, поэтому я не буду публиковать, но у меня есть информация.

5
задан templatetypedef 15 March 2012 в 19:44
поделиться