伪随机算法
自然界中的理想随机便是:进行无限次执行后一种情况出现的频率=这种情况的概率;
计算机中的随机的原理都是算法,往往结果都有一种特定的趋势,因此都被归类为伪随机。
伪随机算法有很多,计算机中常用的随机函数往往都是取随机效力较高(趋势趋近真随机)并且资源消耗少的算法
而伪随机算法中有几个不变的模式:种子 公式 迭代
种子:一段变化量;
公式:使种子不按照特定规律得到另一个或一组值的公式;
迭代:重复执行公式获得最终不可预料的值。
冯·诺伊曼在1946年提出的平方取中法就是一种例子。在效率不高的当年这种随机公式效率高,但是随机效力不怎么样,适用于数值积分计算机
具体算法:
百度百科 - 平方取中法(其实是复制维基的)
维基百科 - 平方取中法
|
演示:
模块:
Main():调用产生模块
Time():一个默认周期7的时钟,产生迭代次数并产生补数数值(就是补充后确保让最终数值能够顺利继续按照法则执行)
Seed():一个默认周期23的时钟,产生基数种子(在现代计算机中往往运用系统时间、文件路径、计算机名等作为种子)
SubS():截取平方的后9位
SubT():截取平方的后8位
SubD():补数
SubF():最终值
|
特殊原理:
1.算法
算法整体原理就是把n位种子平方后的值(必须为2n位)取中间n位(n为偶数)
2.取中
为了避免20次枚举,我使用了两个模块取中,具体原理就是:
-a . +a-b . -a+2b . +a-3b ……到小于指定位数为止
3.双种子
构建方法为两个质数周期时钟。如果实在是嫌模块效率将Time每次增量设为5或3,Seed每次增量设为31以上质数。
具体方法详见模块
|
模块因为互相关联,为了简化所以逻辑比较复杂,因此无法一条一条分析
但是提供存档供研究:
http://pan.baidu.com/s/1pKrmFxh
注:
@r还是目前游戏中最优的随机法,因为直接调用后台随机。本帖纯属个人技术兴趣。
[groupid=546]Command Block Logic[/groupid]