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

又get3种新的rand方式,简单又实用
分别为高斯分布随机,过滤随机,和perlin随机,perlin老朋友了,主要说说前两种。

高斯分布随机(Gaussian Randomness)

高斯分布也叫正态分布(Normal distribution)或钟形曲线(bell curves),正态分布再熟悉不过了。它长这个样子:
 
为什么要根据高斯分布来产生随机呢,这里要提到一个名词“中心极限定理(central limit theorem)”。中心极限定理:在自然界与生产中,一些现象受到许多相互独立的随机因素的影响,如果每个因素所产生的影响都很微小时,总的影响可以看作是服从正态分布的。中心极限定理就是从数学上证明了这一现象 。简单来讲就是:在现实生活中的随机性概率加起来是符合正态分布的。这就是我们为什么使用高斯分布随机的原因,就是为了时产生的结果更真实。
基于高斯分布的这种随机可以用于:速度,人的特性,随即一片森林的树木高低,人的身高,发射子弹的偏差,等等自然界常见的事情。
Unity中的实现代码:
    
using UnityEngine;
using System.Collections;

public class Gaussian : MonoBehaviour
{
    public int seed = 61829450;
    double sum = 0;
    long r = 0;
    // Use this for initialization
    void Start()
    {

    }

    // Update is called once per frame
    void Update()
    {
        if (Time.frameCount % 7== 0)
        {
     //       seed = 61829450;
            sum = 0;
        for (int i = 0; i < 3; i++)
        {
            long holdseed = seed;
            seed ^= seed << 13;
            seed ^= seed >> 17;
            seed ^= seed << 5;
            r = holdseed + seed;
            sum += (double)r * (1.0 / 0x7FFFFFFFFFFFFFFF);
        }
        print( sum); //returns [-3.0, 3.0] at (66.7%, 95.8%, 100%)
        }
    }
}



下图示普通伪随机和高斯随机分别模拟射子弹的偏差
 
高斯分布大部分的点都在中心,普通的伪随机分布的比较均匀,明显高斯分布更加真实。玩家当然也希望能射准,爆头率更高。
高斯分布的用途:
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


评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值