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