Delphi中随机函数的可靠性如何
-
08-10-2019 - |
题
我正在编写一个程序,该程序在Delphi中编写统计测试(必须是Delphi),我听说随机功能有些奇怪。当程序启动时,您必须调用随机化以随机化随机函数的种子。
我想知道随机函数(随机调用后)是否足够随机用于统计测试或需要Mersenne Twister?是否有人对随机的实际实施有任何洞察力,可以告诉我这有多重要?
解决方案
无论 Random
对于您的统计测试非常可靠,将取决于您打算使用它的上下文。
话虽如此,我编写了几篇Delphi代码,需要进行适当的统计数据,并使用了 Random
例如,获得各种无效分布,数据伪复制和重采样。到目前为止,我还没有在我自己的代码中遇到任何情况 Random
本来会产生偏见或不可靠的结果,或者将其用于预期统计检验的结果。但是,对于我的代码而言,不一定要为您的代码保留。
如有疑问,您当然可以统计地分析电话的结果 Random
(例如,在R,SPSS等中)并检查结果分布是否违反了您特定统计测试的分布要求。 [如果您是适当的科学家,这就是您应该做的。
您是否需要其他prng-例如 TPMATH 库包含一些。 (对于更多涉及的事情,还有可以从R通过Delphi调用精心设计的统计功能的选择。)
其他提示
与几乎所有编程语言RTL PRNG一样,Delphi的Prng是一个 线性一致发电机.
对于大多数小规模的东西来说,它已经足够好了,但是有一些事情要注意。特别是,请注意低阶位:乘法的模式并添加意味着低阶位根本不是很随机的。但这通常仅适用于拉出的大型32位值,然后用 mod
或类似。使用 Random(10)
在内部使用0到9之间的值在整个32位范围内使用乘法,而不是 mod
手术。
我忍不住。
如果您正在寻求一种方法来保证在执行时间最快的执行时间的随机数字的唯一性,则 about.com 在 最快的唯一随机数生成器, , 和 帕特里克·范·洛格(Patrick Van Logchem)的实施 has been elected as the winner.
除非您购买一些相对深奥的硬件,否则计算机可以提供的随机数的最佳近似值是完全确定性的伪随机序列。通常,随机函数使用一些相对随机的值(通常是基于时间,但有时是在鼠标运动上 - 我不知道Delphi的作用)作为种子,该种子提供了伪随机序列的入口点。没有此,您最终将每次以相同的顺序恢复相同的随机数,这往往会击败首先使用随机数的目的。
好的,我意识到这并不能回答有关可靠性的问题,但是它应该使您有些信心,要求您要求随机化是一个好发电机而不是坏发电机的标志。有大量统计测试显示数字序列的随机程度,并且Delphi随机数发生器可能适合许多目的,因为它是成熟的产品。
只是为了增加可能性 - Windows提供了一系列内置 加密功能. 。如果默认情况下尚未包含在内,也可能还有一个Delphi包装器。
这些功能也是 密码强的随机数生成器. 。这是迄今为止您将在软件中获得的最佳随机性,因为它根据很长的因素列表来播种。我不确定,但是我怀疑如果您有一个硬件随机数生成器,它甚至会使用硬件随机数生成器。
如果这还不够,您也可以尝试在 量子随机位生成器服务 对于一些 真的 随机值。
从Embarcadero网站:
_lrand是长的随机数生成器函数。 _rand使用带有周期2^64的乘法一致性随机数生成器来返回连续的伪随机数,范围为0到2^31-1。
通过调用以1的参数值调用SRAND来重新定位生成器。可以通过调用带有给定种子号的SRAND将其设置为新起点。
如果他们没有更改实现该实现(Delphi 4 IIRC),那么Delphi prng是这样的:
Randseed:=int32(Randseed*$08088405)+1
result:=Randseed*Range shr 32
(伪代码/假设乘法在任意大整数上)
在0..9之间返回随机返回
StrToInt(copy(FloatToStr(Random),4,1))
注意:使用前检查floattoStr(随机)长度或使用小数零件的任何其他数字...