小言_互联网的博客

unity之随机数

350人阅读  评论(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。
运行结果:

2、随机小数的生成

// -----------------------
// -----------------------
// --@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;
            }

        } 
    }
}

效果如下:是不是有点像捉迷藏呢!

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

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

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

是什么意思?

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

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

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

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


转载:https://blog.csdn.net/shirln/article/details/109112137
查看评论
* 以上用户言论只代表其个人观点,不代表本网站的观点或立场