You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Unity(C#)批量生成随机数出现连续重复批次,如何获取高质量随机数?

解决Unity随机数大规模连续重复的问题

1. 重新初始化随机种子(最简单修复)

Unity自带的UnityEngine.Random默认用系统时钟初始化,但如果短时间内重复触发生成逻辑(比如同一帧内多次调用),可能出现种子重复,进而导致连续相同的序列。你可以在生成随机数前仅调用一次初始化逻辑,用更随机的种子:

// 放在生成序列前,比如游戏启动时或需要重置随机序列的时机
UnityEngine.Random.InitState((int)System.DateTime.Now.Ticks);

int[] random_numbers = new int[500];
for(int i = 0; i < 500; i++) 
{
    random_numbers[i] = UnityEngine.Random.Range(60, 100);
}

⚠️ 不要在循环内部调用InitState,否则每次循环重置种子,会导致更严重的重复问题。

2. 改用.NET的System.Random类

如果Unity自带的随机数生成器序列不符合预期,可以切换到.NET标准库的System.Random,它的序列分布更均匀,不易出现大规模连续重复:

// 复用同一个实例,避免频繁创建导致种子重复
System.Random rng = new System.Random();
int[] random_numbers = new int[500];
for(int i = 0; i < 500; i++) 
{
    // Next方法上限是排他的,所以写100会生成60-99的整数
    random_numbers[i] = rng.Next(60, 100);
}

如果是多线程场景,建议给每个线程单独维护一个System.Random实例,避免线程安全问题。

3. 使用加密级随机数(最高质量)

如果需要绝对高质量的随机数(比如抽奖、敏感场景),可以用.NET的加密随机数生成器,它基于系统加密源,随机性极强:

using System.Security.Cryptography;

int[] random_numbers = new int[500];
using (RNGCryptoServiceProvider rng = new RNGCryptoServiceProvider())
{
    byte[] buffer = new byte[4];
    for(int i = 0; i < 500; i++) 
    {
        rng.GetBytes(buffer);
        int randomInt = BitConverter.ToInt32(buffer, 0);
        // 将随机数映射到60-99的范围
        random_numbers[i] = 60 + Math.Abs(randomInt) % 40;
    }
}

这种方法性能略低于前两种,但500个数据量的开销完全可以忽略,几乎不会出现连续重复的情况。

额外注意事项

  • 避免频繁创建随机数生成器实例,不管是UnityEngine.Random还是System.Random,频繁创建可能因系统时钟精度问题导致种子重复,生成相同序列。
  • 多线程环境下,UnityEngine.Random不是线程安全的,优先选用System.Random或加密级生成器。

内容的提问来源于stack exchange,提问作者GreenSaber

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.10 17:40:45