Unity中random函数的简单使用

本文介绍了Unity中Random函数的几种使用方式,包括从数组中随机取元素、模拟不同概率事件的发生,以及结合AnimationCurve实现概率分布。通过Random.value生成0到1之间的随机数,并与预设概率数组进行比较,实现不同概率的事件触发。此外,还讲解了如何利用AnimationCurve进行概率分布的平滑调整,通过curve.Evaluate(Random.value)进行浮点到整数的转换,实现更灵活的随机效果。

一:如果想要从一个数组中随机的取出一个数据,此时可以用Random函数,如:

var element = myArray[Random.Range(0, myArray.Length)];

注意这里取值的范围是0~Length-1

二:在不同概率下发生事件的场景:
一般将事件发生概率储存在一个数组中,比如float[]{0.5,0.25,0.2,0.05},此时随机生成一个介于0~1之间的数,与上述的值进行比较,很明显,这个随机数的值在0-0.5这个区间的概率最大。

 float Choose (float[] probs) {

        float total = 0;

        foreach (float elem in probs) {
            total += elem;
        }

        float randomPoint = Random.value * total;

        for (int i= 0; i < probs.Length; i++) {
            if (randomPoint < probs[i]) {
                return i;
            }
            else {
                randomPoint -= probs[i];
            }
        }
        return probs.Length - 1;
    }

Random.value :返回一个0~1之间的数。

三:利用曲线

public AnimationCurve curve;
float CurveWeightedRandom(AnimationCurve curve) {
    return curve.Evaluate(Random.value);
}

定义一个公有的AnimationCurve ,就可以对它进行编辑。
这里写图片描述
这里写图片描述
curve.Evaluate(Random.value)参数是随机出的一个值,可以认为是图中的横坐标,函数会返回它所对应的竖坐标的值,其中曲线越陡峭的地方代表发生的概率越大,越平坦的地方代表发生的概率越小。由于返回的是float类型,如果想要整形,Mathf.RoundToInt().

四:洗牌类任务

 void Shuffle (int[] deck) {
        for (int i = 0; i < deck.Length; i++) {
            int temp = deck[i];
            int randomIndex = Random.Range(0, deck.Length);
            deck[i] = deck[randomIndex];
            deck[randomIndex] = temp;
        }
    }
<think>我们正在讨论UnityRandom.Range的使用方法。根据用户提供的引用内容,我们可以总结以下几点: 1. Random.Range有两个重载: - `int Random.Range(int min, int max)`: 返回一个,范围包括`min`但不包括`max`。 - `float Random.Range(float min, float max)`: 返回一个浮点,范围包括`min`和`max`(但注意引用[4]提到对于float,最大值max会出现,但概率很小;而整则不包括max)。 2. 使用重载时,注意最大值是排除的,所以如果要包含上限,需要将max参设置为比实际最大值大1。 3. 使用浮点重载时,必须确保参是浮点,即在字后面加上`f`,否则会被当作整处理(导致错误,如一直返回0)。 4. 引用[3]提到了Random.state的使用,可以保存和恢复随机生成器的状态,以便重现随机序列。 5. 引用[2]提到了C#的Random类,但UnityRandom.Range是UnityEngine命名空间下的,与C#的Random类不同。 现在,我将根据这些信息,详细说明UnityRandom.Range的使用方法。 ### UnityRandom.Range的使用方法 在Unity中,`Random.Range`是一个用于生成随机的静态方法。它有两个重载版本:一个用于整一个用于浮点。 #### 1. 整版本 ```csharp int randomInt = Random.Range(int minInclusive, int maxExclusive); ``` - 参: - `minInclusive`: 随机范围的最小值(包含)。 - `maxExclusive`: 随机范围的最大值(不包含)。 - 返回值:一个大于等于`minInclusive`且小于`maxExclusive`的整。 **示例:** ```csharp // 生成0到9之间的整(包括0,不包括10,所以是0,1,2,...,9) int randomNumber = Random.Range(0, 10); ``` 注意:如果你想生成包括最大值的整,需要将第二个参设置为最大值+1。例如,生成1到10的整(包括10): ```csharp int randomNumber = Random.Range(1, 11); // 生成1,2,...,10 ``` #### 2. 浮点版本 ```csharp float randomFloat = Random.Range(float minInclusive, float maxInclusive); ``` - 参: - `minInclusive`: 随机范围的最小值(包含)。 - `maxInclusive`: 随机范围的最大值(包含)。 - 返回值:一个大于等于`minInclusive`且小于等于`maxInclusive`的浮点。 **示例:** ```csharp // 生成0.0到1.0之间的浮点(包括0.0和1.0) float randomFloat = Random.Range(0f, 1f); ``` 注意:在写浮点时,必须加上`f`后缀,否则会被当作double类型,导致编译错误或逻辑错误(如一直返回0)。 #### 3. 使用Random.state控制随机状态 Unity随机生成器有一个全局状态,可以通过`Random.state`来保存和恢复。这在需要重现随机序列时非常有用。 **示例:** ```csharp // 保存当前随机状态 Random.State savedState = Random.state; // 生成一些随机 Debug.Log(Random.Range(0, 100)); Debug.Log(Random.Range(0, 100)); // 恢复之前保存的状态 Random.state = savedState; // 再次生成相同的随机序列 Debug.Log(Random.Range(0, 100)); // 与第一次调用相同 Debug.Log(Random.Range(0, 100)); // 与第二次调用相同 ``` #### 4. 初始化随机种子 使用`Random.InitState`可以设置随机生成器的种子,以便每次运行产生相同的随机序列。 **示例:** ```csharp // 设置种子 Random.InitState(12345); // 接下来生成的随机序列将相同 Debug.Log(Random.Range(0, 100)); Debug.Log(Random.Range(0, 100)); ``` ### 注意事项 - 整版本不包含最大值,浮点版本包含最大值(尽管引用[4]提到浮点最大值出现概率很小,但理论上包含)。 - 在需要重复随机序列的场景(如回放、测试)中,使用`Random.state`或`Random.InitState`来控制随机状态。 - 避免在需要浮点时忘记加`f`后缀,否则可能得到错误的结果。 ### 示例代码 下面是一个简单Unity脚本,演示了Random.Range的使用: ```csharp using UnityEngine; public class RandomExample : MonoBehaviour { void Start() { // 整随机 int randomInt = Random.Range(0, 100); // 0到99 Debug.Log("Random Integer: " + randomInt); // 浮点随机 float randomFloat = Random.Range(0f, 100f); // 0.0到100.0(包含) Debug.Log("Random Float: " + randomFloat); // 使用Random.state Random.State originalState = Random.state; // 改变状态 Random.InitState(100); Debug.Log("Same seed first: " + Random.Range(0, 100)); Debug.Log("Same seed second: " + Random.Range(0, 100)); // 恢复状态 Random.state = originalState; Debug.Log("After restore: " + Random.Range(0, 100)); // 恢复后,随机序列继续原来的状态 } } ``` ### 常见错误 1. 整范围错误:例如想要1到10的整,却写成`Random.Range(1,10)`,这样只会得到1到9。应该写成`Random.Range(1,11)`。 2. 忘记加f后缀:例如`Random.Range(0,1)`,这里两个参都是整,所以调用的是整重载,返回0(因为整范围[0,1)只有0)。正确写法是`Random.Range(0f,1f)`。 ### 总结 Unity的`Random.Range`方法提供了生成整和浮点随机的功能。使用时注意参类型和范围,整范围不包括最大值,浮点范围包括最大值。同时,可以通过`Random.state`和`Random.InitState`来控制随机序列的生成。 §§相关问题§§ 1. Unity中如何生成一个随机的布尔值(true或false)? 2. 在Unity中,如何生成一个指定范围内的随机,并且包括最大值? 3. Unity随机生成器全局状态会影响所有随机生成吗?如何避免在生成关键随机时被其他代码干扰?</think>### Unity Random.Range 使用方法详解 在Unity中,`Random.Range` 是生成随机的核心方法,根据参类型分为整和浮点两种重载形式: #### 1. **整版本**(不包括最大值) ```csharp int randomInt = Random.Range(int min, int max); ``` - **范围规则**:包括最小值 `min`,**不包括**最大值 `max` - **示例**: ```csharp int dice = Random.Range(1, 7); // 生成1-6的整(骰子点) ``` - **注意事项**: 若需要包含最大值,需将上限+1: ```csharp int result = Random.Range(0, 101); // 生成0-100的整(包含100) ``` #### 2. **浮点版本**(包括最大值) ```csharp float randomFloat = Random.Range(float min, float max); ``` - **范围规则**:包括最小值 `min` 和最大值 `max` - **示例**: ```csharp float percentage = Random.Range(0f, 100f); // 生成0.0-100.0的浮点 ``` - **关键细节**: 必须添加 `f` 后缀标识浮点: ```csharp // 正确写法(带f后缀) float pos = Random.Range(-5.5f, 5.5f); // 错误写法(会被识别为整) float error = Random.Range(0, 1); // 始终返回0 ``` #### 3. **高级用法** - **随机布尔值生成**: ```csharp bool coinFlip = Random.Range(0, 2) == 0; // 50%概率true/false ``` - **保存/恢复随机状态**(用于重现随机序列): ```csharp Random.State originalState = Random.state; // 保存当前状态 // ...生成随机... Random.state = originalState; // 恢复状态 ``` - **初始化随机种子**: ```csharp Random.InitState(12345); // 固定种子产生可重复序列 ``` #### 4. **使用示例** ```csharp // 生成随机位置 Vector3 spawnPos = new Vector3( Random.Range(-10f, 10f), Random.Range(0f, 5f), 0 ); // 随机选择组元素 Color[] colors = { Color.red, Color.blue, Color.green }; Color randomColor = colors[Random.Range(0, colors.Length)]; // 注意Length不包含 ``` > **关键区别总结**: > | 参类型 | 包含最小值 | 包含最大值 | 典型用途 | > |----------|------------|------------|----------| > | `int` | ✓ | ✗ | 索引、离散值 | > | `float` | ✓ | ✓ | 位置、比例、连续值 | ### 常见问题解决 1. **为什么浮点总是返回0?** 检查是否漏写 `f` 后缀:`Random.Range(0f, 1f)` ✅ 而非 `Random.Range(0, 1)` ❌ 2. **如何包含整最大值?** 将上限+1:`Random.Range(1, 101)` 生成1-100的整 3. **如何重现随机序列?** 使用 `Random.State` 保存状态或 `Random.InitState()` 设置种子[^3]
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值