
批處理逆推隨機數種子原理見跟蹤CMD中的隨機數%random%,類似 demon 的方案,不過不怕延時和引用 random 帶來的干擾:
nclick="copycode($('code0'));">復制代碼
- @echo off&setlocal enabledelayedexpansion
- for /f delims== %%a in ('set') do if /i %%a neq path set %%a=
- set /a 層數=200,時間范圍=43200
- ::層數決定為一個初始種子檢測多少層,時間范圍設置的是向上追溯多少秒
- for /l %%a in (1 1 %random:~,2%) do break !random!
- ::隨機引用 n 次 %random%,使種子偏離初始值,對 random 的所有引用次數不能超過預設的層數
- ping /n !random:~,1! 127.1 >nul
- ::隨機延時 1 次 %random%,拉開時間差
- echo 開始于 !time!
- set /a rand1=%random%,rand2=%random%
- ::獲取兩個用于參照的隨機數,與計算結果完全符合時認定為取得種子
- for /f tokens=1-9 delims=:./- %%a in (!date:~,10! !time!) do (
- set /a m=(1%%b+29)%%12,y=%%a-m/10,t=365*y+y/4-y/100+y/400+(m*306+5)/10+1%%c-719569
- set /a t=t*86400+%%d*3600+1%%e*60+1%%f-34900,end=t-t%% 時間范圍
- )
- ::換算 1970.1.1 至今的總秒數
- for /l %%a in (!t! -1 !end!) do (
- title %%a
- set /a seed=%%a*0x343fd+0x269ec3,r2=(seed>>0x10)&0x7fff
- for /l %%b in (1 1 %層數%) do (
- set /a r1=r2,r2=(seed*0x343fd+0x269ec3>>0x10)&0x7fff,seed=seed*0x343fd+0x269ec3
- if !r1!_!r2!==%rand1%_%rand2% (
- set /a 時間間隔=t-%%a
- echo 向前追溯共 !時間間隔! 秒
- echo 向上追溯第 %%b 層
- echo 初始種子為 %%a
- goto end
- )
- )
- )
- echo 未能發現種子,可能是因為層數太淺或延時超過 !時間范圍! 秒
- pause&exit
- :end
- echo 當前種子為 %seed%
- echo 結束于 !time!
- echo;
- set /a r=(seed*0x343fd+0x269ec3>>0x10)&0x7fff,seed=seed*0x343fd+0x269ec3
- echo 下個隨機數也許是 !r!,按任意鍵查看
- pause>nul
- echo !random!
- pause

