随机种子

来源:互联网 发布:bruker核磁软件 编辑:程序博客网 时间:2024/04/25 11:35

我们经常说的随机数,可是随机数是如何产生的呢?


Random a = new Random(47)



伪随机数是以一个称为“种子”的数作为初始条件,通过固定的算法产生一个看上去像是随机产生的数字序列的。


举例来说,这个算法可以设计成类似于“将给定的种子开平方,取有效数字的第2至9位作为下一次迭代的种子,重复此过程3次后,以结果的第1-4位作为返回值、并将该结果作为下次调用本过程的种子”等等。

然而,无论这个算法如何复杂,只要它固定不变,则对于相同的种子来说,每一次从这个种子开始、第n次通过该算法取得的伪随机数却总是一样的,因此必须再通过各种真正客观的途径使得该初始的种子不同。一般来说常用的方式是以运行时候的时钟时间,经一定变化后作为初始的种子的。



一般种子可以以当前的系统时间,这是完全随机的
算法1:平方取中法。
1)将种子设为X0,并mod 10000得到4位数
2)将它平方得到一个8位数(不足8位时前面补0)
3)取中间的4位数可得到下一个4位随机数X1
4)重复1-3步,即可产生多个随机数
这个算法的一个主要缺点是最终它会退化成0,不能继续产生随机数。
算法2:线性同余法
1)将种子设为X0,
2)用一个算法X(n+1)=(a*X(n)+b) mod c产生X(n+1)
一般将c取得很大,可产生0到c-1之间的伪随机数
该算法的一个缺点是会出现循环。
在windows平台下,可以考虑将如下参数作为影响种子的因素。
⒈GetTickCount()
系统启动以来的嘀嗒时间
说明:该时间与系统运行时长相关,
⒉GetCurrentProcessId()
当前进程Id号
说明:该Id与系统启动进程数量及次序有关,一般波动范围较小。
⒊GetCurrentProcess()
当前进程句柄
说明:该句柄实质就是内存地址,但每次进程启动时地址值是不确定的。
⒋GetProcessTimes()
进程时间参数
说明:-
⒌GetCurrentThreadId()
当前线程Id号
⒍GetCurrentThread()
当前线程句柄
⒎GetThreadTimes()
线程时间参数
⒏GetCurrentHwProfile()
Profile配置文件
⒐GetSysColor()
系统Color
⒑GetSystemInfo()
系统信息
⒒GetSystemPowerStatus()
电源状态
⒓GetKeyboardState()
键盘状态
⒔GlobalMemoryStatus()
内存状态
⒕time()
当前时间 秒
⒖GUID
各硬件设备GUID
⒗MAC
网卡mac
⒘CPUID
CPU Id号
⒙声卡录音噪音
该参量与环境相关
⒚用户键盘间隔时间
该参量与用户习惯相关
其次,尽最大可能增加这些因素的维度。这里说的维度是指
种子结果与因素之间的关联程度。一般使用hash函数对多个
因素进行哈希运算。这样得到的种子具有较强的散列特性。
通过以上技术手段得到的种子产生的伪随机数是具有较好
统计特性的,它不依赖于某一台机器,某一时刻,某一方法,
而是复杂多变、让人捉摸不透难于重现的。

1 0