当前位置: 首页 > article >正文

【Unity/C#】Fisher-Yates洗牌算法

在进行某些类型的游戏设计中,常常需要将某些元素进行打乱。比如,扑克牌的打乱、生成随机的元素序列等等。那么推荐你使用下面这种打乱效果优良的算法——Fisher-Yates洗牌算法。

它的思路非常简单:

1.已知一段要进行打乱的数组

2.创建一个新的数组,每次从要打乱的数组中随机选择一个元素,加入到新数组当中

3.从原来的数组中移除这个元素

4.直到原来的数组的元素全部被移除完,即打乱完毕。

那么我们来实现一下这个效果:

public List<int> Shuffle(List<int> a)
{
    List<int> b = new List<int>();
    for(int i = 0 ; i < a.Count ; i++)
    {
        int index = Random.Range(0,a.Count)
        int item = a[index];
        b.Add(item);
        a.RemoveAt(index);
    }
    return b;
}

上述这个是按照算法的思路来进行实现的,然而时间复杂度还可以进行优化。

我们可以直接将原本的数组进行改造,能够将时间复杂度减低到O(n)

我们来看看优化版本的算法:

public List<int> Shuffle(List<int> a)
{
    //获得列表的长度
    int n = a.Count;
    for(int i = n - 1 ; i > 0 ; i--)
    {
        //随机选一个索引,
        int index = Random.Range(0,i + 1);
        //将随机抽取到的元素与当前元素做交换
        (a[index],a[i]) = (a[i],a[index]);
    }
    return a;
}


http://www.kler.cn/a/456851.html

相关文章:

  • 【模电刷题复习--填空】
  • 常用的linux命令介绍
  • GraphRAG 框架哪家强?选择最适合你智能问答系统的框架
  • 点进CSS选择器
  • SQL 实战:联合查询与子查询 – 数据比对与关联查询优化
  • 【Spark】架构与核心组件:大数据时代的必备技能(上)
  • 湖仓一体架构解析:数仓架构选择(第48天)
  • 软件安全性测试有多重要?好用的安全测试工具有哪些?
  • 使用 CSS 的 `::selection` 伪元素来改变 HTML 文本选中时的背景颜色
  • docker安装记录
  • leetcode hot100 括号生成
  • 实战ubuntu22.04 软raid查看命令
  • 【AI学习】DeepSeek-V3 技术报告学习:总体架构
  • pugixml XML配置文件 的增删改查
  • Qt中QWidget自定义形状
  • 基于Spring Boot的个人健康管理系统
  • 数据库课程设计-工资管理系统-MySQL
  • Gateway Timeout504 网关超时的完美解决方法
  • 自动化测试启动chrome debug模式
  • Elasticsearch检索方案之一:使用from+size实现分页
  • 基于Oauth2的SSO单点登录---前端
  • .NET周刊【12月第3期 2024-12-15】
  • 深入解析Android Framework中的android.location包:架构设计、设计模式与系统定制
  • TensorFlow深度学习实战(2)——使用TensorFlow构建神经网络
  • 一篇文章了解 Kafka
  • 深度学习训练过程图表可视化工具总结