代碼如下,但是當選號范圍與個數相近的時候,判斷相同的亂數的函式會出現錯誤,提示的錯誤是無限回圈或者無限遞回,為什么啊?當選號范圍是30同時選號個數是29的時候,會出現錯誤。
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
namespace _1._5
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
int up,number=0;
private void button1_Click(object sender, EventArgs e)
{
if (number != 0) label3.Text = "";
up = Convert.ToInt32(this.numericUpDown1.Value); //范圍,最大值
number = Convert.ToInt32(this.numericUpDown2.Value); //亂數個數
if (up <= number)
{
MessageBox.Show("選號范圍必須大于選號個數!", "錯誤提示");
return ;
}
int[] a=new int[up];
a = getRandomNum(number, 0, up); //呼叫產生亂數
for (int i = 0; i < number; i++)
{
label3.Text = label3.Text+" "+ a[i].ToString();
}
}
private void button2_Click(object sender, EventArgs e)
{
Close();
}
//以下程式代碼來源于書上
//產生亂數
public int[] getRandomNum(int num, int minValue, int maxValue)
{
Random ra = new Random(unchecked((int)DateTime.Now.Ticks));
int[] arrNum = new int[num]; //定義陣列(大小)
int tmp = 0;
for (int i = 0; i < num; i++)
{
tmp = ra.Next(minValue, maxValue); //產生亂數賦給tmp
arrNum[i] = getNum(arrNum, tmp, minValue, maxValue, ra);
}
return arrNum;
}
Random ra=new Random(unchecked((int)DateTime.Now.Ticks));
//判斷當前產生的亂數是否與之前的數有重復----遞回演算法
public int getNum(int[] arrNum, int tmp, int minValue, int maxValue, Random ra)
{
for (int n = 0; n <=arrNum.Length -1; n++)
if (arrNum[n] == tmp)
{
tmp = ra.Next(minValue, maxValue); /******在這里提示無限遞回********/
getNum(arrNum, tmp, minValue, maxValue, ra);
}
return tmp; //回傳到getRandomNum()函式中
}

出現error
uj5u.com熱心網友回復:
崩潰的時候在彈出的對話框按相應按鈕進入除錯,按Alt+7鍵查看Call Stack即“呼叫堆疊”里面從上到下列出的對應從里層到外層的函式呼叫歷史。雙擊某一行可將游標定位到此次呼叫的源代碼或匯編指令處,看不懂時雙擊下一行,直到能看懂為止。uj5u.com熱心網友回復:
遞回函式必須有條件退出才行, 但是如果滿足條件的幾率非常少的時候, 會造成非常深,導致堆疊溢位錯誤轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/121812.html
標籤:界面
