首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > .NET > C# >

关于生成不重复随机数报错的有关问题

2013-07-11 
关于生成不重复随机数报错的问题我想生成20个随机数,随机数生成的值范围在1~34之间,问题是经常性的在执行

关于生成不重复随机数报错的问题
我想生成20个随机数,随机数生成的值范围在1~34之间,问题是经常性的在执行过程中就报错:
未处理 System.StackOverflowException
“System.StackOverflowException”类型的未经处理的异常出现在 System.Windows.Forms.dll 中。
疑难解答提示:确保您没有无限循环或无限递归
根据我的理解应该是在生成的随机数需判断该数字是否已经存在,如果已经存在就递归调用重新生成这里出现问题的,不知道有没有理解错误,请问这个是我的递归哪里没有写好吗,有没有更好的解决方法?

具体代码如下:


private void btnCreateNumber_Click(object sender, EventArgs e)
        {
            int[] sorttemp = new int[20];
            for (int i = 0; i < 20; i++)
            {
                sorttemp[i] = CheckNumberRepeat(sorttemp);
            }
        }

private int CheckNumberRepeat(int[] iImport)
        {
            Random NumRandom = new Random();
            int iTempRedNum = NumRandom.Next(1, 34);
            for (int i = 0; i < iImport.Length; i++)
            {
                if (iImport[i] == iTempRedNum)
                {
                    CheckNumberRepeat(iImport);
                }
            }
            return iTempRedNum;
        }

------解决方案--------------------


int[] result = Enumerable.Range(1, 34).OrderBy(x => Guid.NewGuid()).ToList().Take(20).ToArray();
[解决办法]

引用:
我想生成20个随机数,随机数生成的值范围在1~34之间,问题是经常性的在执行过程中就报错:
未处理 System.StackOverflowException
“System.StackOverflowException”类型的未经处理的异常出现在 System.Windows.Forms.dll 中。
疑难解答提示:确保您没有无限循环或无限递归
根据我的理解应该是在生成的随机数需判断该数字是否已经存在,如果已经存在就递归调用重新生成这里出现问题的,不知道有没有理解错误,请问这个是我的递归哪里没有写好吗,有没有更好的解决方法?

具体代码如下:

private void btnCreateNumber_Click(object sender, EventArgs e)
        {
            int[] sorttemp = new int[20];
            for (int i = 0; i < 20; i++)
            {
                sorttemp[i] = CheckNumberRepeat(sorttemp);
            }
        }

private int CheckNumberRepeat(int[] iImport)
        {
            Random NumRandom = new Random();
            int iTempRedNum = NumRandom.Next(1, 34);
            for (int i = 0; i < iImport.Length; i++)
            {
                if (iImport[i] == iTempRedNum)
                {
                    CheckNumberRepeat(iImport);
                }
            }
            return iTempRedNum;
        }


这是一个多么二的做法呀

你想要的是1-34不重复的随机数是不



 private int[] Rnd(int count)
        {


            Random rnd = new Random();
            List<int> list = new List<int>();
            for (int i = 1; i <= 34; i++)
            {
                list.Add(i);
            }

            if (count > list.Count) count = list.Count;

            List<int> result = new List<int>();
            for (int i = 0; i < count; i++)
            {
                int a = list[rnd.Next(1, list.Count)];
                list.Remove(a);
                result.Add(a);
            }

            return result.ToArray();

        }

热点排行