• 产生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

  • 相关阅读:
    套路
    委托、事件 茴字有几种写法
    数学 矩阵
    webForm系列 前端框架快速引用
    图片引用
    【HTML】Advanced6:HTML5 Forms Pt. 1: Input Types
    【HTML】Advanced5:Accessible Forms
    【HTML】Advanced4:Accessible Links
    【HTML】Advanced3:Tables: Columns, Headers, and Footers
    【HTML】Advanced2:Conditional Comments
  • 原文地址:https://www.cnblogs.com/riskyer/p/3313074.html
Copyright © 2020-2023  润新知