关于延迟程序和随机数发生算法的后续讨论(80分)

  • 主题发起人 主题发起人 DarwinZhang
  • 开始时间 开始时间
D

DarwinZhang

Unregistered / Unconfirmed
GUEST, unregistred user!
在:
http://www.delphibbs.com/delphibbs/dispq.asp?lid=1604583
中有一个延迟不确定导致随机数发生效率地下的问题,

http://www.delphibbs.com/delphibbs/dispq.asp?lid=1667223
中尝试进行解释,不过暂时还没有成功,
现在希望能够继续讨论这个问题,
当前creation-zy兄提出用:
waitforSingleObject
Caption:=Caption;
Application.ProcessMessages;
来延迟,并利用获得CPU频率获得系统的大概评估来获得随机数字。
欢迎大家提出新的想法或给出建议!
 
延时过程可以简化为:
procedure Delay0;
var
MyEvent:Thandle;
begin
MyEvent:=CreateEvent(nil,True,False,nil) ;
waitforSingleObject(MyEvent,0);
//wait 0 ms here!
CloseHandle(MyEvent);
with Form1do
Caption:=Caption;
Application.ProcessMessages;
end;

我的延时过程是基于API调用耗时的随机性的,效率非常高。约26000个CPU周期就能够产
生一个信息熵大于4Bit的随机数,即约每7000个CPU Cycle产生1bit随机信息。
虽然生成的随机数的随机效果极佳(我用自制的工具进行了频谱分布分析),但是我仍然
不清楚为什么简单的API调用会产生如此之大的随机性。
 
我发现,很多关于句柄操作的API都有不错的随机行,
比如:
findwindow
postmessage
等等,即使单独用
waitforSingleObject

sendmessage(wm_settext,...
也有不错的随机性,
不过appplication.processmessage的随机性就不太好。
这可能会涉及到“纤维”的概念,不过没有足够的资料。
 
检验随机分布的数学依据:
假设在区间[a,b]中有随机变量X,测试样本x1,x2,....xn
avg(x)=(x1+x2+...+xn)/n;
S2=Σ(Xi-Avg(x))/(n-1);
R=Sqr(b-a)/12;
根据大数定理,知道假如x服从均匀分布,那么
s2 应该在 R/3到 3*R之间,
既: 0.3333< S2/R <3
 
我在做串行口通讯程序的时候发现,Windows要及时比要随机难得多呢![:)]
 
接受答案了.
 
后退
顶部