1. 程式人生 > >模擬擲骰子

模擬擲骰子

以下程式碼能夠計算每種兩個骰子之和的準確概率分佈:

int SIDES = 6;
double[] dist = new double[2 * SIDES + 1];
for (int i = 1; i <= SIDES; i++)
for (int j = 1; j <= SIDES; j++)
		dist[i + j] += 1.0;
	for (int k = 2; k <= 2 * SIDES; k++)
		dist[k] /= 36.0;

dist[i]的值就是兩個骰子之和為i的概率。

用實驗模擬N次擲骰子,並在計算兩個1到6之間的隨機整數之和時記錄每個值的出現頻率以驗證它們的概率。N要多大才能保證你的經驗資料和準確資料的吻合程度達到小數點後三位?

實驗程式碼:

import edu.princeton.cs.algs4.*;

public class fly {
	public long test() {
		// 記錄試驗次數
		long N = 0;
		// 計算每種兩個骰子之和的準確概率分佈
		int SIDES = 6;
		double[] dist = new double[2 * SIDES + 1];
		for (int i = 1; i <= SIDES; i++)
			for (int j = 1; j <= SIDES; j++)
				dist[i + j] += 1.0;
		for (int k = 2; k <= 2 * SIDES; k++)
			dist[k] /= 36.0;
		// 儲存實驗結果
		double[] probaility = new double[13];
		// 比較實驗情況和真實情況,得到N值
		while (true) {
			N++;
			int a = StdRandom.uniform(1, 7);
			int b = StdRandom.uniform(1, 7);
			probaility[a + b] = probaility[a + b] + 1.0;
			for (int i = 0; i < 11; i++) {
				if (Math.abs(probaility[i + 2] / N - dist[i + 2]) < 0.001) {
					if (i == 10) {
						StdOut.print(N);
						return N;
					}
					continue;
				}
				break;
			}
		}
	}

	public static void main(String[] args) {
		new fly().test();
	}
}

經過多次實驗表明,N的值處於數十萬級別。