Нужен таймер, точно синхронизированный с системным временем.
Ровно в полночь должен реинициализироваться генератор псевдослучайных чисел.
void CALLBACK RandomSeedCountdown ( UINT uTimerID, UINT, DWORD_PTR dwUser, DWORD_PTR, DWORD_PTR )
{
CMainDialog* pDlg = ( CMainDialog* ) dwUser;
SYSTEMTIME sysTime;
::GetLocalTime ( &sysTime );
sysTime.wSecond = 60 - sysTime.wSecond;
sysTime.wMinute = 60 - sysTime.wMinute;
sysTime.wHour = 23 - sysTime.wHour;
if ( pDlg && pDlg->GetSafeHwnd ( ) )
{
COleDateTime dt ( sysTime );
pDlg->SetDlgItemText ( IDC_RANDOM_SEED_COUNTDOWN, dt.Format ( L"До реинициализации ГПЧ осталось: %H:%M:%S" ) );
};
if ( sysTime.wSecond == 0 && sysTime.wMinute == 0 && sysTime.wHour == 0 )
g_theSharp.SeedRandom ( );
};
BOOL CMainDialog::OnInitDialog ( void )
{
timeSetEvent ( 10, 0, RandomSeedCountdown, ( DWORD_PTR ) this, TIME_PERIODIC );
...
Открывая окно системных часов и свою программу заметна сильная разница в тиках секунд.
Изменение периодичности и точности таймера не дают результатов.