CString cmdLine = exePath + _T("XLSConverter.exe ") +
_T("C:\\temp\\XLS\\temp.xls") + _T(" txt C:\\temp\\XLS");
STARTUPINFO si = { sizeof(STARTUPINFO) };
si.wShowWindow = SW_HIDE;
PROCESS_INFORMATION pi;
if (!CreateProcess(NULL, cmdLine.GetBuffer(), NULL, NULL, TRUE,
0, NULL, NULL, &si, &pi))
{
AfxMessageBox(_T("轉換引擎啟動失敗"));
return;
}
WaitForSingleObject(pi.hProcess, INFINITE); // 等待轉換完成
CloseHandle(pi.hProcess); CloseHandle(pi.hThread);
// 後續讀取產生的 temp.txt 解析學生資料
class CRandomGen
{
static const double PI;
public:
// 產生 [min, max] 區間均勻隨機數 (4 位小數精度)
double AverageRandom(double min, double max)
{
int minI = (int)(min * 10000);
int maxI = (int)(max * 10000);
int r = (rand() * rand()) % (maxI - minI) + minI;
return r / 10000.0;
}
// 常態分布機率密度函數
double Normal(double x, double miu, double sigma)
{
return 1.0 / (sqrt(2*PI)*sigma) * exp(-(x-miu)*(x-miu)/(2*sigma*sigma));
}
// 拒絕採樣:只接受落在常態曲線下的隨機數
double NormalRandom(double miu, double sigma, double min, double max)
{
double x, y, scope;
do {
x = AverageRandom(min, max);
y = Normal(x, miu, sigma);
scope = AverageRandom(0, Normal(miu, miu, sigma)); // 最大密度值
} while (scope > y);
return x;
}
};
為每位學生指派一個 NormalRandom 值,依此值排序即得隨機座次,統計分布符合常態分布。
CFrameWnd + CView 物件。OnFilePrintPreview() 進入預覽模式。OnDraw 繪製表格、學生姓名、座號。主對話框:CListCtrl 顯示匯入名單、隨機結果。工具列提供「匯入」、「隨機排序」、「列印預覽」、「列印」按鈕。