拓展资料:C#Shuffle算法(洗牌算法、抽样算法) - 简书


代码:

using System.Collections.Generic;
using UnityEngine;/** *  Writer:June* *  Date: 2020.12.21* *  Function:三种洗牌算法* *  Remarks:* */public class ShuffleLogic : MonoBehaviour
{#region 三种洗牌算法/// <summary>/// Fisher-Yates Shuffle 算法,会打乱原链表,时间复杂度O(n^2) 空间复杂度O(n)/// </summary>/// <typeparam name="T">链表类型</typeparam>/// <param name="_list">目标链表</param>public void FisherYatesShuffle<T>(List<T> _list){List<T> tempList = new List<T>();int rand;T tempValue;while (_list.Count > 0){//随机索引 所能取得的最大长度是链表的长度-1rand = Random.Range(0, _list.Count);tempValue = _list[rand];//放到新建的链表中tempList.Add(tempValue);//将取出后的值从链表中移除,下次遍历则不会再取出_list.RemoveAt(rand);}//将打乱顺序后的链表重新赋给原链表for (int i = 0; i < tempList.Count; i++){_list.Add(tempList[i]);}}/// <summary>/// Knuth-Durstenfeld Shuffle算法,效率最高,会打乱原数组,时间复杂度O(n) 空间复杂度O(1)/// </summary>/// <typeparam name="T">数组类型</typeparam>/// <param name="_array">目标数组</param>public void KnuthDurstenfeldShuffle<T>(T[] _array){int rand;T tempValue;for (int i = 0; i < _array.Length; i++){rand = Random.Range(0, _array.Length - i);tempValue = _array[rand];_array[rand] = _array[_array.Length - 1 - i];_array[_array.Length - 1 - i] = tempValue;}}/// <summary>/// Inside-Out Algorithm 算法,不会打乱原链表,返回打乱后的链表,时间复杂度O(n),空间复杂度O(n)/// </summary>/// <typeparam name="T">链表类型</typeparam>/// <param name="_list">目标链表</param>/// <returns>返回打乱顺序后的链表</returns>public List<T> InsideOutAlgorithm<T>(List<T> _list){List<T> tempList = new List<T>(_list);int rand;T tempValue;for (int i = tempList.Count - 1; i >= 0; i--){rand = Random.Range(0, i + 1);tempValue = tempList[rand];tempList[rand] = tempList[i];tempList[i] = tempValue;}return tempList;}#endregion
}

Unity | 三种洗牌算法相关推荐

  1. 三种洗牌算法shuffle

    1. 背景 笔试时,遇到一个算法题:差不多是 在n个不同的数中随机取出不重复的m个数.洗牌算法是将原来的数组进行打散,使原数组的某个数在打散后的数组中的每个位置上等概率的出现,刚好可以解决该问题. 2 ...

  2. 洗牌算法shuffle

    对这个问题的研究始于一次在群里看到朋友发的洗牌面试题.当时也不知道具体的解法如何,于是随口回了一句:每次从剩下的数字中随机一个.过后找相关资料了解了下,洗牌算法大致有3种,按发明时间先后顺序如下: 一 ...

  3. python——洗牌算法

    原地址:洗牌算法 对这个问题的研究始于一次在群里看到朋友发的洗牌面试题.当时也不知道具体的解法如何,于是随口回了一句:每次从剩下的数字中随机一个.过后找相关资料了解了下,洗牌算法大致有3种,按发明时间 ...

  4. shuffle洗牌算法java_洗牌算法shuffle

    洗牌算法 1.   背景 阿里的面试的时候做的一道笔试题:题目:写一个方法,入参为自然数n  (n > 0),返回一个自然数数组,数组长度为n,元素为[1,n]之间,且每个元素不重复,数组中各元 ...

  5. 程序员编程艺术第三十四~三十五章:格子取数问题,完美洗牌算法

    第三十四~三十五章:格子取数,完美洗牌算法 作者:July.caopengcs.绿色夹克衫.致谢:西芹_new,陈利人, Peiyush Jain,白石,zinking. 时间:二零一三年八月二十三日 ...

  6. 程序员编程艺术第三十四 三十五章 格子取数问题,完美洗牌算法

    分享一下我老师大神的人工智能教程!零基础,通俗易懂!http://blog.csdn.net/jiangjunshow 也欢迎大家转载本篇文章.分享知识,造福人民,实现我们中华民族伟大复兴! 第三十四 ...

  7. 等概率随机取数算法的几种实现(洗牌算法)

    等概率随机取数算法的几种实现 最近读了项目中的工具脚本,发现一个随机取数的函数,功能大概是从M个数中不重复的随机取出N个数,算是数组随机排序然后取前N个值的变种. 脚本实现采取原始的方法,每随机取一个 ...

  8. 游戏洗牌算法——常用+详解最优Knuth_Durstenfeld算法

    目录 前言 基于Unity的洗牌算法代码实现 内容 抽牌洗牌 原理 复杂度 优缺点 Fisher_Yates算法 原理 复杂度 代码实现 优缺点 Knuth_Durstenfeld算法(最佳洗牌算法) ...

  9. 会排序吗_洗牌算法详解:你会排序,但你会打乱吗?

    预计阅读时间: 8 分钟 我知道大家会各种花式排序,但是如果叫你打乱一个数组,你是否能做到胸有成竹?即便你拍脑袋想出一个算法,怎么证明你的算法就是正确的呢?乱序算法不像排序算法,结果唯一可以很容易检验 ...

最新文章

  1. es java聚合查询只有10_关于在elasticSearch中使用聚合查询后只显示10个bucket的问题...
  2. SQL Server Extended Events (扩展事件)
  3. python基础教程:3种控制流语句(if,for,while)
  4. HDU 1385 Minimum Transport Cost
  5. 怎么进行数据平滑滤波_气相色谱数据处理方法 EWG1990仪器学习网
  6. 历城职专学前计算机专业,历城职专学前教育专业2020学年第一学期技能运动会拉开帷幕...
  7. 前端学习(3085):vue+element今日头条管理-封装数据接口
  8. Linux命令应用大词典-第25章 备份与还原
  9. Storm系列(四)Topology提交校验过程
  10. redis 管理工具_Redis桌面管理工具Redis Desktop Manager 2019.2发布
  11. java拷贝文件夹和删除文件夹
  12. 学习Python技术,怎么才能更好找到工作
  13. 机动车c1科三考试语言灯光,c1科目三灯光模拟考试
  14. Html 点透镂空遮罩,swift 实现遮罩部分区域“挖洞”效果和点击事件穿透
  15. kafka(一)设计分析
  16. 基于智能手机的物流管理系统
  17. ie浏览器html页面怎么清缓存,Web项目中,清理浏览器缓存的几种方式
  18. 计算机网络教室使用,计算机网络教室使用管理制度
  19. 电脑上怎么看网络丢包/网络延时
  20. 周爱民:真正的架构师是没有title的

热门文章

  1. HTTP请求错误状态码大全status code
  2. Mysql主键设计-转拉钩教育
  3. 04.蒙特卡洛算法 (三门问题)
  4. iMeta | 宁波大学附属第一医院崔翰斌团队综述缺血性心脏病相关肠道微生物及菌群代谢物研究进展...
  5. Java - Calendar对于特殊夏令营日期的处理(防止采坑)
  6. IoT黑板报:西门子与源讯联手打造网络安全技术
  7. 原生js 实现2048小游戏
  8. API卡_儿童电话手表该用哪种卡合适?
  9. Clion代码提示功能消失无法标出错误代码
  10. 原来这就是笔杆子公文写作材料经典提纲汇编