产生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个位置起填充数组

下面是程序允许的一些截图:

产生n不同随机数的算法

偶尔会出现一张照片出现超过两次的问题,目前还没发现是为什么,如果大家知道,希望可以告诉我。嘻嘻

喜欢仙剑的童鞋可以点这里:http://download.csdn.net/detail/qinyuanpei/6244993

上一篇:jsoup Cookbook(中文版)-Jsoup解析HTML


下一篇:Spring Boot 获取ApplicationContext