游戏人工智能开发之进阶版随机技术

来源:互联网 发布:java连接redis数据库 编辑:程序博客网 时间:2024/05/21 04:21

原文地址:游戏人工智能开发之进阶版随机技术


又get3种新的rand方式,简单又实用

分别为高斯分布随机,过滤随机,和perlin随机,perlin老朋友了,主要说说前两种。

高斯分布随机(Gaussian Randomness)

高斯分布也叫正态分布(Normal distribution)或钟形曲线(bell curves),正态分布再熟悉不过了。它长这个样子:
 
为什么要根据高斯分布来产生随机呢,这里要提到一个名词“中心极限定理(central limit theorem)”。中心极限定理:在自然界与生产中,一些现象受到许多相互独立的随机因素的影响,如果每个因素所产生的影响都很微小时,总的影响可以看作是服从正态分布的。中心极限定理就是从数学上证明了这一现象 。简单来讲就是:在现实生活中的随机性概率加起来是符合正态分布的。这就是我们为什么使用高斯分布随机的原因,就是为了时产生的结果更真实。
基于高斯分布的这种随机可以用于:速度,人的特性,随即一片森林的树木高低,人的身高,发射子弹的偏差,等等自然界常见的事情。
Unity中的实现代码:
    
[csharp] view plaincopy
  1. using UnityEngine;  
  2. using System.Collections;  
  3.   
  4. public class Gaussian : MonoBehaviour  
  5. {  
  6.     public int seed = 61829450;  
  7.     double sum = 0;  
  8.     long r = 0;  
  9.     // Use this for initialization  
  10.     void Start()  
  11.     {  
  12.   
  13.     }  
  14.   
  15.     // Update is called once per frame  
  16.     void Update()  
  17.     {  
  18.         if (Time.frameCount % 7== 0)  
  19.         {  
  20.      //       seed = 61829450;  
  21.             sum = 0;  
  22.         for (int i = 0; i < 3; i++)  
  23.         {  
  24.             long holdseed = seed;  
  25.             seed ^= seed << 13;  
  26.             seed ^= seed >> 17;  
  27.             seed ^= seed << 5;  
  28.             r = holdseed + seed;  
  29.             sum += (double)r * (1.0 / 0x7FFFFFFFFFFFFFFF);  
  30.         }  
  31.         print( sum); //returns [-3.0, 3.0] at (66.7%, 95.8%, 100%)  
  32.         }  
  33.     }  
  34. }  



下图示普通伪随机和高斯随机分别模拟射子弹的偏差
 
高斯分布大部分的点都在中心,普通的伪随机分布的比较均匀,明显高斯分布更加真实。玩家当然也希望能射准,爆头率更高。
高斯分布的用途:
1.    速度
2.    加速度
3.    尺寸,宽度,高度,质量
4.    模拟视觉,反应时间
5.    子弹填充速度,开火速度
6.    刷新率,冷却率


过滤随机

过滤随机更讲求“公平”,也就是随的越乱就好。过滤是指,我们随机的数有时候太接近,或者差距太多的时候把这些数“过滤”掉,重新随机。
有证据证明,当随机的表现非常小的时候,人类并没有感觉这是随机的。
举个例子,很多人不相信掷硬币的结果是随机的,因为你掷出的结果可能是这样的:
 
有大量的重复00000或11111紧挨在一起。如果你把暴击设为随机产生,随机结果如上图,敌人可能连续发动四五个暴击直接把你连死,这不是玩家想要的结果。但这确实是随机产生的啊,所以有的时候玩家的乐趣比真实性更重要。

二进制过滤

挡在下面几种情况的时候发生过滤:
1.    如果新产生的数已经有四个了,重新随机一个新数
2.    如11001100,会被替换为11001101
3.    111000 或 000111,替换最后一个数

替换前替换后作对比:
 

过滤整数

1.    有两个重复的随机数,则重新随机新数
2.    隔了一个数的重复,如“8, 3, 8” 或 “6, 2, 6” 
3.    太多极限值出现,即太多大值和小值,如“6, 8, 7, 9, 8, 6, 9” 
4.    10个数以内出现两组重复数如“5, 7, 3, 1, 5, 7”
5.    连续上升,或连续下降,如“3, 4, 5, 6”
6.    10个数之内重复次数过多,如“9, 4, 5, 9, 7, 8, 9, 0, 2, 9”
替换前替换后作对比:
 

过滤浮点小数

0-1之间的浮点数
1.    两个连续数字相差小于0.02,如0.875 和0.856
2.    三个连续数字相差小于0.1,如0.345, 0.421, 和0.387.
3.    五个连续增加或连续下降,如0.342, 0.572, 0.619, 0.783, 和0.868.
4.    太多极限值出现,即太多大值和小值,0.325, 0.198, 0.056, 0.432, and 0.216.



总结

如果想要产生的结果更真实,就是用高斯分布随机。如果为了让玩家更开心,可以对产生的随机数进行过滤。


          ------by  wolf96    http://blog.csdn.net/wolf96


原文地址:游戏人工智能开发之进阶版随机技术

0 0
原创粉丝点击