产生n不同随机数的算法
昨天无聊,就模仿仙剑5外传中的卡牌游戏做了一个小游戏,结果在开发这个小游戏的时候,碰到了产生多个不同随机数的问题。我们知道,仙剑中的卡牌游戏是随机产生16张图片,并且这16张图片是两个一组的,因为只有选中了相同的图片,这一组图片才能消除。所以这个问题,可以简化为:随机产生n个随机数,且保证每个数字都有唯一的一个数字和它对应。如1、3、4、6、7、6、1、3、4、7这样一组数字。那么这个问题怎么解决呢?首先我们先思考怎样产生n个不同的随机数,如果直接使用Random类,我们不能保证这n个随机数互不相同。我的思路是用递归的方法,即对于每一个随机产生的数,进行一次检查,如果已经存在这个数,那么立即用一个新的随机数进行替换,你可能会问,你怎么保证,这个新生成的随机数就不会和已知的随机数重复的,这时候,递归就派上了用场。下面我们来看代码:
public int[] GetRandom(int length, int min, int max)
{
Random r=new Random();
int[] temp = new int[length];
for (int i = 0; i < length; i++)
{
temp[i] = r.Next(min, max);
Program.CheckRandom(temp, temp[i], min, max);
}
return temp;
} public int CheckRandom(int[] items,int value,int min,int max)
{
int n = 0;
Random r=new Random();
while (n <= items.Length - 1)
{
if (items[n] == value)
{
value = r.Next(min, max);
CheckRandom(items, value, min, max);
}
n++;
}
return value;
}
其中GetRandom用于获取n个不同的随机数,CheckRandom用于检查随机数,另外,给出下面的一篇文章供大家参考:
http://blog.csdn.net/lynnlin1122/article/details/2318906
那么到这里,我们只是解决了第一个问题,即产生n个不同的随机数。在实际的问题中,我们还需要以某种特殊的方式,得到它的另一半。由于这里的数据个数是偶数,我们很容易的想到先取出一半随机数填充前面的n/2个位置,再随机将前面的这一半的随机数随机地填充到后面的n/2个位置。所以,其算法描述为:
1、使用GetRandom获取前面的n/2个随机数,进行填充。
2、保存前面得到的数组
3、使用GetRnadom获取从n/2+1到n之间的随机数
4、将第二部保存的数组按照第三步得到的随机数索引,从n/2+1个位置起填充数组
下面是程序允许的一些截图:
偶尔会出现一张照片出现超过两次的问题,目前还没发现是为什么,如果大家知道,希望可以告诉我。嘻嘻
喜欢仙剑的童鞋可以点这里:http://download.csdn.net/detail/qinyuanpei/6244993
产生n不同随机数的算法的更多相关文章
- Redis源代码分析(23)--- CRC循环冗余算法RAND随机数的算法
他今天就开始学习Redis源代码的一些工具来实现,在任何一种语言工具.算法实现的原理应该是相同的,一些比較经典的算法.比方说我今天看的Crc循环冗余校验算法和rand随机数产生算法. CRC算法全称循 ...
- Java随机数生产算法
java提供了Math.random()函数,返回一个double类型的随机数,也有util包里的Random类,可以生成double,int,float,long,bytes等随机数. 但有些业务需 ...
- C语言之实现随机数产生算法
随机数,也就是在不同的时刻产生不同的数值.在UNIX操作系统和window的操作系统上,我们知道有一个函数rand,它就是用来产生随机数的函数API接口,那么它的原理如何实现? 如果约定a1=f(se ...
- JavaScript 随机数相关算法
// Math.ceil() 返回大于等于数字参数的最小整数(取整函数),对数字进行上舍入 // Math.floor() 返回小于等于数字参数的最大整数,对数字进行下舍入 // Math.round ...
- 洗牌算法Fisher-Yates以及C语言随机数的产生
前些天在蘑菇街的面试中碰到一道洗牌的算法题,拿出来和大家分享一下! 原题是:54张有序的牌,如何无序的发给3个人? 这个题是运用经典的洗牌算法完成.首先介绍一种经典的洗牌算法--Fisher-Yate ...
- 基于“均态分布”随机数算法的一次性口令OneTimePassword(原创)
/* 所谓均态分布随机数算法是指:每个数(整数或实数)无序地分布在数轴上,值只出现一次永不重复.体现了香农的一次一密理论. * 均体现在每个数的值是平均概率,即都有出现:态体现在每个数在数轴上的位置是 ...
- C语言基础(11)-随机数发生器
一. rand() rand是一个C语言库函数,功能是生成一个随机数.rand需要一个不同的种子,才能生成不同的随机数. 二. srand(int seed) rand需要一个不同的种子,才能生成不同 ...
- 【原创】开源Math.NET基础数学类库使用(13)C#实现其他随机数生成器
本博客所有文章分类的总目录:[总目录]本博客博文总目录-实时更新 开源Math.NET基础数学类库使用总目录:[目录]开源Math.NET基础数学类库使用总目录 前言 ...
- 随机数是骗人的,.Net、Java、C为我作证(转)
几乎所有编程语言中都提供了"生成一个随机数"的方法,也就是调用这个方法会生成一个数,我们事先也不知道它生成什么数.比如在.Net中编写下面的代码: Random rand = ne ...
随机推荐
- Java正则表达式基本应用
一.概述 正则表达式因为其强大的字符串处理能力,刚开始被被广泛地应用到各种UNIX工具中,如大家熟知的 Perl脚本语言 .后来正则表达式在各种 计算机语言 和各种应用领域得到了广泛的应用和发展,目前 ...
- Solr基础理论与维护管理快速上手(含查询参数说明)
1. solr基础 因为 Solr 包装并扩展了 Lucene,所以它们使用很多相同的术语.更重要的是,Solr 创建的索引与 Lucene 搜索引擎库完全兼容.通过对 Solr 进行适当的配置,某些 ...
- 基于visual Studio2013解决C语言竞赛题之0804成绩筛选
题目
- Swift - 禁用UIWebView和WKWebView的下拉拖动效果
使用UIWebView或WKWebView加载网页时,如果页面处于最顶端时,用户用手指往下拖动,会露出灰色空背景.同样页面在最底部的时候,继续向上拖动,下方也会露出空背景. 要禁止这个拖动效果,可进行 ...
- 使用ViewPager模拟实现应用程序启动界面
经常在开发应用程序的时候,软件启动有启用动画界面,一般使用图片来进行界面该版本最新更新等等内容,今天来使用ViewPager来模拟实现这功能,也希望对大家有个小小的参考作用,在以后的项目中能够使用到. ...
- C#调用存储过程实现分页(个人代码笔记)
分页的存储过程: drop proc LoadPageMain create Proc LoadPageMain @pageIndex )) Fid ) ].Rows ) ...
- code blocks 快捷键
设置快捷键可以在setting-Editor-keyboard shortcuts里设置 ==日常编辑== • 按住Ctrl滚滚轮,代码的字体会随你心意变大变小.• 在编辑区按住右键可拖动代码,省去拉 ...
- TImage也有OnClick事件,可以当按钮使用,配上合适的图片(背景透明,效果前凸)更是几乎以假乱真
本质上TImage与TSpeedButton没有什么区别,都是没有句柄的,但都可以执行OnClick事件.有空分析一下.
- Java引用详解
区分几个概念 ,类 .对象 .对象的引用 A a1 = new A(); A a2 = a1; a1-------------------->对象内存<---------------- ...
- 调用ShellExecute所须要头文件
调用ShellExecute所须要头文件 #include "windows.h " #include "shellapi.h "