練習題(四)

亂數練習:擲(六面)骰子的機率模擬程式。

本文以C++實作執行。

使用C/C++亂數函式必須宣告stdlib.h或cstdlib,使用的時候直接呼叫rand()即可。

#include <iostream>
#include <cstdlib>
#include <iomanip>

using namespace std;


int main() {
	const int arraysize = 7;
	int dice[arraysize] = { 0 };

	for (int i = 0; i < 60000; i++)
	{
		dice[1 + rand() % 6]++;
	}

	cout << "Face" << setw(13) << "Frequency" << endl;

	for (int j = 1; j < arraysize; j++)
	{
		cout << setw(4) << j << setw(13) << dice[j]<<endl;
	}

	system("pause");
	return 0;
}

執行結果如下:

上述程式執行幾次之後會發現,每次亂數產生的結果都一樣,那是因為沒有設定亂數種子。

因為C/C++的內建亂數是使用數學公式來計算,所以會有亂數的初始值,也就是亂數種子。亂數種子就是給亂數產生的公式初始值,如果不設定的話通常亂數種子初始值為0。

也因此我們可以使用一樣是定義在stdlib.h或cstdlib的srand()的函數來改變一開始的亂數值。srand()需要一個參數當作是種子好用來產生一個新的亂數序列,通常我們用目前的時間來傳入,也就是定義在time.h或ctime中的time()函數。

完整程式碼如下:

#include <iostream>
#include <ctime>
#include <cstdlib>
#include <iomanip>

using namespace std;


int main() {
	srand(time(0));
	const int arraysize = 7;
	int dice[arraysize] = { 0 };

	for (int i = 0; i < 60000; i++)
	{
		dice[1 + rand() % 6]++;
	}

	cout << "Face" << setw(13) << "Frequency" << endl;

	for (int j = 1; j < arraysize; j++)
	{
		cout << setw(4) << j << setw(13) << dice[j] << endl;
	}

	system("pause");
	return 0;
}

執行結果如下:

有夢最美 築夢踏實

活在當下 認真過每一天

我是阿夢 也是Ace