【发布时间】:2012-04-01 09:21:02
【问题描述】:
我发现我的程序发生了一些奇怪的事情。
这个程序主要用于组件点击,因为它是一个测试随机性的概念。
如您所见,它打印正确,因为它应该有向中间点击的趋势,这非常完美。
问题是,它似乎有偏见。
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%然后每隔一个。
有人知道这其中的原因吗?
哦,顺便说一句,我确实有一个 txt 文件,其中包含以百分比等重复 10,000,000 次打印出来的每个结果,它很长,所以我不会发布,但我确实有信息。
【问题讨论】:
-
你需要为随机函数播种。
-
没有按预期打印?这对你来说是随机的......
-
为什么要对
x和y进行按位与运算?你期望它有什么意义?还是您认为if((x & y) == 101)与if ((x == 101) && (y == 101))的含义相同? -
你的意思是
if((x&y)==101)还是if(x==101 && y==101)? -
你问的是什么?为什么某些位模式的“计数”有偏差?简而言之,您的输入数据中存在偏差,因此该偏差很可能也出现在您的输出数据中。此外,对随机生成的数字执行操作并不能保证结果是随机分布的。实际上,有一种理论认为,您执行的转换越多,结果就越有可能呈正态分布(这可能正是您所看到的)。