C#实现不用随机函数(Random)的洗牌算法
代码不多,先看效果:
类代码:
1 static class ShuffleCards
2 {
3 private static int lastHash = 0;
4 public static void Work(byte[] cards)
5 {
6 if (lastHash == 0)
7 lastHash = System.Environment.TickCount;
8 int len = cards.Length - 2;
9 int mod = 0;
10 byte temp = 0;
11 for (int i = cards.Length - 1; i >= 0 && len>0; i--)
12 {
13 lastHash = (lastHash << 5) - lastHash + i;
14 mod = lastHash < 0 ? lastHash % len * (-1) : lastHash % len;
15 temp = cards[mod];
16 cards[mod] = cards[i];
17 cards[i] = temp;
18 len--;
19 }
20 }
21 }
测试代码:
1 //16张牌0~F
2 byte[] cards = new byte[16];
3 //洗上99次
4 for (int j = 0; j < 100; j++)
5 {
6 //每次都初始化顺序为 0~F
7 for (int i = 0; i < cards.Length; i++)
8 cards[i] = (byte)i;
9 //洗牌调用
10 ShuffleCards.Work(cards);
11 StringBuilder ret = new StringBuilder();
12 //输出
13 for (int i = 0; i < cards.Length; i++)
14 ret.Append(cards[i].ToString("X") + " ");
15 Console.WriteLine(j.ToString()+" > "+ ret.ToString());
16 }
17 Console.ReadLine();
C#实现不用随机函数(Random)的洗牌算法的更多相关文章
- 519. Random Flip Matrix(Fisher-Yates洗牌算法)
1. 问题 给定一个全零矩阵的行和列,实现flip函数随机把一个0变成1并返回索引,实现rest函数将所有数归零. 2. 思路 拒绝采样 (1)先计算矩阵的元素个数(行乘以列),记作n,那么[0, n ...
- 洗牌算法及 random 中 shuffle 方法和 sample 方法浅析
对于算法书买了一本又一本却没一本读完超过 10%,Leetcode 刷题从来没坚持超过 3 天的我来说,算法能力真的是渣渣.但是,今天决定写一篇跟算法有关的文章.起因是读了吴师兄的文章<扫雷与算 ...
- random array & shuffle 洗牌算法 / 随机算法
random array & shuffle shuffle 洗牌算法 / 随机算法 https://en.wikipedia.org/wiki/Fisher–Yates_shuffle ES ...
- C# 洗牌算法
最近悟出来一个道理,在这儿分享给大家:学历代表你的过去,能力代表你的现在,学习代表你的将来. 十年河东十年河西,莫欺少年穷 学无止境,精益求精 C#洗牌算法如下: class Program { ...
- js 随机数 洗牌算法
function shuffle(arr){ var len = arr.length; for(var i = 0;i<len -1;i++) { var idx = Math.floor(M ...
- Fisher–Yates shuffle 洗牌算法(zz)
1,缘起 最近工作上遇到一个问题,即将一组数据,比如[A,B,C,D,E]其中的两个B,E按随机排列,其他的仍在原来的位置: 原始数组:[A,B,C,D,E] 随机字母:[B,D] 可能结果:[A,B ...
- 《Algorithms算法》笔记:元素排序(3)——洗牌算法
<Algorithms算法>笔记:元素排序(3)——洗牌算法 Algorithms算法笔记元素排序3洗牌算法 洗牌算法 排序洗牌 Knuth洗牌 Knuth洗牌代码 洗牌算法 洗牌的思想很 ...
- 洗牌算法shuffle
对这个问题的研究始于一次在群里看到朋友发的洗牌面试题.当时也不知道具体的解法如何,于是随口回了一句:每次从剩下的数字中随机一个.过后找相关资料了解了下,洗牌算法大致有3种,按发明时间先后顺序如下: 一 ...
- 洗牌算法Fisher-Yates以及C语言随机数的产生
前些天在蘑菇街的面试中碰到一道洗牌的算法题,拿出来和大家分享一下! 原题是:54张有序的牌,如何无序的发给3个人? 这个题是运用经典的洗牌算法完成.首先介绍一种经典的洗牌算法--Fisher-Yate ...
- Python洗牌算法重写
Python有自带的洗牌算法函数shuffle(). 自己也通过学习也琢磨了一下它的实现,然后给出一个时间复杂度O(n),空间复杂度O(4)的例子: import random def shuffle ...
随机推荐
- 鸣人的影分身(等级考试4级 2021-03 T3)
题目: 此题题干又臭又长,直接看简化版. 鸣人的影分身(等级考试4级 2021-03 T3)等效于 把m个苹果分到n个盘子中,问有几种可能? dp[i][j]表示有i个盘子j个苹果时有多少种放法. 用 ...
- 20个 Git 命令玩转版本控制
想要在团队中处理代码时有效协作并跟踪更改,版本控制发挥着至关重要的作用.Git 是一个版本控制系统,可以帮助开发人员跟踪修订.识别文件版本,并在必要的时候恢复旧版本.Git 对于有一定编程经验的用户来 ...
- WPF中使用LibVLCSharp.WPF 播放rtsp
目录 LibVLCSharp.WPF简介 vlc:VideoView基本使用 安装LibVLC 播放rtsp 引入命名空间 xaml 代码 cs代码 截图 概述 代码示例 vlc:VideoView进 ...
- 如何优化 Vue.js 应用程序
单页面应用(SPAs)当处理实时.异步数据时,可以提供丰富的.可交互的用户体验.但它们也可能很重,很臃肿,而且性能很差.在这篇文章中,我们将介绍一些前端优化技巧,以保持我们的Vue应用程序相对精简,并 ...
- Docker安装Tomcat应用服务器
1.安装镜像 1. Install the image: 可以先到https://hub.docker.com/ 搜索镜像 You can get there first. https://hub. ...
- vue2.x中关于引用图片的问题
vue中引用图片的几种情况 错误片段一 <!-- template --> <img :src="p" alt="" width=" ...
- 题解 [ZJOI2007]棋盘制作
把悬线法这个坑填了,还是很简单的 qwq. 悬线法一般解决有一定约束条件的最大矩形问题.悬线的定义是从一个点一直往上走直到边界或者不符合条件结束. 炒个例子,在这题里面比如说有这样一个矩形 0 1 0 ...
- JavaSE 对象与类(一)
对象与类 1.面向对象程序概述 Java是完全面向对象的,必须熟悉OOP才能够编写Java程序. 概念:类class.实例(对象)instance 由类构造(construct)对象的过程称为创建类的 ...
- 常规诊疗条件下比较依那西普生物类似药(益赛普)与阿达木、英夫利西对RA的疗效[EULAR2015_SAT0360]
常规诊疗条件下比较依那西普生物类似药(益赛普)与阿达木单抗.英夫利西单抗治疗RA的临床疗效 SAT0360 ETANAR - A ETANERCEPT BIOSIMILAR IS AS EFFEC ...
- python路径含空格导致打开文件报错
2023.02.14更新: python中使用os.listdir不行,但是可以用os.walk,可以绕过空格的问题. 在windows中总有奇怪的问题,比如路径或文件名带空格,打开文件就会报错. 一 ...