|
- #include "stdafx.h"
- #include "GetRandom.h"
- #include <shlwapi.h>
- #pragma comment(lib,"Shlwapi.lib") //如果没有这行,会出现link错误
-
- STRUCTRANDOMALL GetRandom::RandomData1;
- CFile GetRandom::gFile; //文件句柄
- BOOL GetRandom::bRun = FALSE; //运行
-
- GetRandom::GetRandom()
- {
- }
-
- //获取随机数
- DWORD GetRandom::GetRandomValue()
- {
- DWORD dRet = 0;
-
- //左边
- if (RandomData1.bPlay >= 90 * 10000 - 1)
- {
- //重新生成
- CreateAllRandomValue();
-
- //更新到备份数据; 把此数据重新生成。 记录更新日志。
- dRet = RandomData1.stData[RandomData1.bPlay].dwRandom;
- RandomData1.bPlay++;
- }
- else
- {
- dRet = RandomData1.stData[RandomData1.bPlay].dwRandom;
- RandomData1.bPlay++;
- }
-
- return dRet;
- }
-
- GetRandom::~GetRandom()
- {
- }
-
- //重新生成随机数
- bool GetRandom::CreateAllRandomValue()
- {
- DWORD dTime = GetTickCount();
- ZeroMemory(&RandomData1, sizeof(STRUCTRANDOMALL));
-
- STRUCTRANDOMALL *p = new STRUCTRANDOMALL();
- if (!p) return false;
- ZeroMemory(p, sizeof(STRUCTRANDOMALL));
-
- for (int i = 100000; i < 100 * 10000;i++)
- {
- RandomData1.stData[i - 100000].dwRandom = i;
- }
-
- //随机种子
- srand(GetTickCount());
-
- int cbMaxCount = 90*10000;
-
- //混乱扑克
- int cbRandCount = 0, cbPosition = 0;
- do
- {
- cbPosition = (rand() % 90 * 10000 + rand() % 10000) % (cbMaxCount - cbRandCount);
- p->stData[cbRandCount++].dwRandom = RandomData1.stData[cbPosition].dwRandom;
- RandomData1.stData[cbPosition].dwRandom = RandomData1.stData[cbMaxCount - cbRandCount].dwRandom;
- } while (cbRandCount<cbMaxCount);
-
- CopyMemory(&RandomData1, p, sizeof(STRUCTRANDOMALL));
-
- if (p) delete p;
- return true;
- }
-
- //加载
- bool GetRandom::Load()
- {
- CFileFind fFind;
-
- if (!PathFileExists(L"RANDOM.D"))
- {
- //如果没有 则创建
- bRun = gFile.Open(L"RANDOM.D", CFile::modeCreate | CFile::modeReadWrite | CFile::typeBinary);
-
- if (!bRun)
- {
- //不成功
- CString str;
- str.Format(TEXT("创建随机文件失败。"));
- CTraceService::TraceString(str, TraceLevel_Normal);
- return false;
- }
- else
- {
- CreateAllRandomValue();
- gFile.Write(&RandomData1, sizeof(RandomData1));
- }
-
- //CString str = TEXT("创建随机文件成功。");
- //CTraceService::TraceString(str, TraceLevel_Normal);
- }
- else
- {
- //有则读取
- bRun = gFile.Open(L"RANDOM.D", CFile::modeReadWrite | CFile::typeBinary);
-
- if (!bRun)
- {
- //不成功
- CString str;
- str.Format(TEXT("打开随机文件失败。"));
- CTraceService::TraceString(str, TraceLevel_Normal);
- return false;
- }
- else
- {
- int iRet = gFile.Read((void*)&RandomData1, sizeof(RandomData1));
- if (iRet <= 0)
- {
- CString str;
- str.Format(TEXT("读取随机文件失败。"));
- CTraceService::TraceString(str, TraceLevel_Normal);
- return false;
- }
- }
- }
- return true;
- }
-
- //保存
- bool GetRandom::End()
- {
- if (bRun)
- {
- gFile.SeekToBegin();
- gFile.Write(&RandomData1, sizeof(RandomData1));
- gFile.Close();
- bRun = false;
- }
- return true;
- }
|