Board logo

标题: [数值计算] 批处理逆推随机数种子 [打印本页]

作者: CrLf    时间: 2013-2-6 01:06     标题: 批处理逆推随机数种子

原理见跟踪CMD中的随机数%random%,类似 demon 的方案,不过不怕延时和引用 random 带来的干扰:
  1. @echo off&setlocal enabledelayedexpansion
  2. for /f "delims==" %%a in ('set') do if /i %%a neq path set "%%a="
  3. set /a 层数=200,时间范围=43200
  4. ::层数决定为一个初始种子检测多少层,时间范围设置的是向上追溯多少秒
  5. for /l %%a in (1 1 %random:~,2%) do break !random!
  6. ::随机引用 n 次 %random%,使种子偏离初始值,对 random 的所有引用次数不能超过预设的层数
  7. ping /n !random:~,1! 127.1 >nul
  8. ::随机延时 1 次 %random%,拉开时间差
  9. echo 开始于 !time!
  10. set /a rand1=%random%,rand2=%random%
  11. ::获取两个用于参照的随机数,与计算结果完全符合时认定为取得种子
  12. for /f "tokens=1-9 delims=:./\- " %%a in ("!date:~,10! !time!") do (
  13.         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"
  14.         set /a t=t*86400+%%d*3600+1%%e*60+1%%f-34900,end=t-t%% 时间范围
  15. )
  16. ::换算 1970.1.1 至今的总秒数
  17. for /l %%a in (!t! -1 !end!) do (
  18.         title %%a
  19.         set /a "seed=%%a*0x343fd+0x269ec3,r2=(seed>>0x10)&0x7fff"
  20.         for /l %%b in (1 1 %层数%) do (
  21.                 set /a "r1=r2,r2=(seed*0x343fd+0x269ec3>>0x10)&0x7fff,seed=seed*0x343fd+0x269ec3"
  22.                 if !r1!_!r2!==%rand1%_%rand2% (
  23. set /a 时间间隔=t-%%a
  24. echo 向前追溯共 !时间间隔! 秒
  25. echo 向上追溯第 %%b 层
  26.                         echo 初始种子为 %%a
  27.                         goto end
  28.                 )
  29.         )
  30. )
  31. echo 未能发现种子,可能是因为层数太浅或延时超过 !时间范围! 秒
  32. pause&exit
  33. :end
  34. echo 当前种子为 %seed%
  35. echo 结束于 !time!
  36. echo;
  37. set /a "r=(seed*0x343fd+0x269ec3>>0x10)&0x7fff,seed=seed*0x343fd+0x269ec3"
  38. echo 下个随机数也许是 !r!,按任意键查看
  39. pause>nul
  40. echo !random!
  41. pause
复制代码

作者: mxxcgzxxx    时间: 2013-2-6 08:55

难得的沙发,试了下,成功了,很好很强大哈
作者: Demon    时间: 2013-2-6 11:21

  1. for /l %%a in (1 1 %random:~,2%) do rem %random%
复制代码
这里%random%只展开了两次
作者: CrLf    时间: 2013-2-6 14:53

回复 3# Demon


    确实,忽略了 !random! 与 %random% 的区别,感谢指正,已修改
作者: Demon    时间: 2013-2-6 20:40

  1. for /l %%a in (1 1 %random:~,2%) do rem !random!
复制代码
这样%random%只展开一次
作者: CrLf    时间: 2013-2-6 23:38

回复 5# Demon


    咦?rem 不愧是专门的注释命令,这么特殊,以前没发现,学习了
    与[50条]不能说的秘密-CMD命令奇诡语法特性汇集中的第 48 条相应证,:: 与 rem 的流程更清晰了




欢迎光临 批处理之家 (http://bathome.net./) Powered by Discuz! 7.2