欢迎来到我的博客小站。  交流请加我微信好友: studyjava。  也欢迎关注同名公众号:Java学习之道

unity之随机数

  |   0 评论   |   0 浏览

推荐阅读:

神奇代码

今天学习别人的项目时看到一段代码闻所未闻,见所未见的代码。百度了一下这段神奇代码,双双缀缀...让我长见识了。
虽然随机数也是开发中经常会用到的工具函数,但是,今天这段代码让我看得似曾相识却又未曾相见。下面,就给大家展示一下我口中的神奇代码吧。

dang dang dang...来了,来了,他来了~~

Random.InitState((int)System.DateTime.Now.Ticks);

这段代码不多,就一句,精炼简洁,却触碰了两次我的知识盲区。好吧,我承认是我接触到的知识太局限了,不过现在也不算太晚。

首先看下百度问答解释:

计算机的“随机数”并非真的“随机数”,而是伪随机数——也就zhi是通过一系列算法,从一个起始数字开始按照一定规则算出来的。 就好像函数F(x)一样,x就是随机数的种子。 你可以做个测试:把你的"new Random(x)"里面的x设置成一个固定数字,例如1,多次运行程序打印随机数,你会发现每次运行打印出来的数字都是一样的。 DateTime.Now.Ticks是指从1970年1月1日(具体哪年忘了哈,好像是1970)开始到目前所经过的毫秒数——刻度数。 用时间毫秒做随机数的种子(x)可以尽量避免上面说的那种“随机数”变成了“非随机数”的情况

普通随机数

生成随机数
一、使用random生成随机数
为给游戏添加趣味性经常会在游戏中随机生成一些不确定的东西。

  1. 使用Random生成随机数。
// -----------------------
// -----------------------
// --@data2020.10.16
// --@autor:shirln
// --随机数测试
// -----------------------
// -----------------------
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

namespace shirln
{
    public class Main: MonoBehaviour
    {
        void Update()
        {
            if(Input.GetKeyDown(KeyCode.Space))
            {
                print("微信搜索公众号【爱上游戏开发】 生成的随机数是:  "+Random.Range(4,10));
            }

        } 
    }
}

表示应用Random方法随机生成4到10之间的整数。不包含10。
运行结果:
在这里插入图片描述

  1. 随机小数的生成
// -----------------------
// -----------------------
// --@data2020.10.16
// --@autor:shirln
// --随机数测试
// -----------------------
// -----------------------
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

namespace shirln
{
    public class Main: MonoBehaviour
    {
        void Update()
        {
            if(Input.GetKeyDown(KeyCode.Space))
            {
                print("微信搜索公众号【爱上游戏开发】 生成的随机数是:  "+Random.Range(4,5f));
            }

        } 
    }
}

表示应用Random方法随机生成4到5之间的小数。
运行结果:
在这里插入图片描述

伪随机数

// -----------------------
// -----------------------
// --@data2020.10.16
// --@autor:shirln
// --伪随机数测试
// -----------------------
// -----------------------
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

namespace shirln
{
    public class Main: MonoBehaviour
    {

        private void Awake()
        {
            Random.InitState(0);
        }

        void Update()
        {
            if(Input.GetKeyDown(KeyCode.Space))
            {
                print("微信搜索公众号【爱上游戏开发】 生成的随机数是:  "+Random.Range(1000,1024));
            }

        } 
    }
}

第一次运行结果:
在这里插入图片描述
第二次运行结果:
在这里插入图片描述
观察发现两次运行结果显示生成的随机数出现的顺序是一样的。所以称为伪随机数。

三、修改语句使每次生成的随机数不同

// -----------------------
// -----------------------
// --@data2020.10.16
// --@autor:shirln
// --伪随机数测试
// -----------------------
// -----------------------
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

namespace shirln
{
    public class Main: MonoBehaviour
    {

        private void Awake()
        {
            Random.InitState((int)System.DateTime.Now.Ticks);
        }

        void Update()
        {
            if(Input.GetKeyDown(KeyCode.Space))
            {
                print("微信搜索公众号【爱上游戏开发】 生成的随机数是:  "+Random.Range(1000,1024));
            }

        } 
    }
}

第一次进入游戏运行结果:
在这里插入图片描述
第二次进入游戏运行结果:
在这里插入图片描述
由此可见每一次运行生成的随机数都是不一样的。

四、其他随机数的生成

  1. colorHsy随机生成颜色。
  2. Value通过随机生成rgb值实现随机生成颜色的目的。
  3. State获取当前的状态,不同的状态生成不同的随机数序列。
  4. Rotation用来得到siyuan数的。
  5. InsideUnitCircle在指定大小的圆内的随机位置生成。
// -----------------------
// -----------------------
// --@data2020.10.16
// --@autor:shirln
// --指定大小的圆内的随机位置生成
// -----------------------
// -----------------------
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

namespace shirln
{
    public class Main: MonoBehaviour
    {
        public Transform cube;
        private void Awake()
        {
            Random.InitState((int)System.DateTime.Now.Ticks);
        }

        void Update()
        {
            if(Input.GetKeyDown(KeyCode.Space))
            {
                cube.position=Random.insideUnitCircle*3;
            }

        } 
    }
}

效果如下:是不是有点像捉迷藏呢!
在这里插入图片描述

  1. insideUnSphere在指定大小的球内的随机位置生成。

为什么生成随机数时要用DateTime.Now.Ticks?DateTime.Now.Ticks的意义是什么?

DateTime.Now.Ticks:获取表示此实例的日期和时间的刻度数。

是什么意思?

计算机的“随机数”并非真的“随机数”,而是伪随机数——也就是通过一系列算法,从一个起始数字开始按照一定规则算出来的。

就好像函数F(x)一样,x就是随机数的种子。

你可以做个测试:把你的"new Random(x)"里面的x设置成一个固定数字,例如1,多次运行程序打印随机数,你会发现每次运行打印出来的数字都是一样的。

DateTime.Now.Ticks的刻度为一百纳秒。
取表示此实例的日期和时间的计时周期数。


标题:unity之随机数
作者:shirln
地址:https://mmzsblog.cn/articles/2020/10/19/1603070354897.html
-----------------------------
如未加特殊说明,此网站文章均为原创。
网站转载须在文章起始位置标注作者及原文连接,否则保留追究法律责任的权利。
公众号转载请联系网站首页的微信号申请白名单!

个人微信公众号 ↓↓↓                 

微信搜一搜爱上游戏开发