網上找了個生成不重復亂數的例子,運行時偶爾會出現重復結果的情況
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-1;i++ ){
this.TxtResult.Text += "\r\ni:" + i + " ";//輸出當前是陣列的第幾個
tmp=ra.Next(minValue,maxValue); //隨機取數
this.TxtResult.Text += "temp: " + tmp;//輸出初始亂數
arrNum[i]=getNum(arrNum,tmp,minValue,maxValue,ra); //取出值賦到陣列中
}
return arrNum;
}
public int getNum(int[] arrNum,int tmp,int minValue,int maxValue,Random ra){
int n=0;
while (n<=arrNum.Length-1)
{
this.TxtResult.Text += " n:" + n + " ";//輸出第幾次回圈
if (arrNum[n]==tmp) //利用回圈判斷是否有重復
{
tmp=ra.Next(minValue,maxValue); //重新隨機獲取。
this.TxtResult.Text += " tmp1: " + tmp + "\t";//內部再次分配的亂數值
getNum(arrNum,tmp,minValue,maxValue,ra);//遞回:如果取出來的數字和已取得的數字有重復就重新隨機獲取。
}
this.TxtResult.Text += " tmp:" +tmp+" " ;//每一次的tmp值
n++ ;
}
this.TxtResult.Text += " return:" + tmp+" ";//回傳的數值
return tmp;
}
我呼叫的是getRandomNum(2,1,10),輸出1到10之間2個不重復的亂數。偶爾會出現兩個重復的值,根據輸出的內部用到的引數值,三層遞回的時候tmp值會恢復原始亂數。從代碼我沒看出有什么問題,誰能幫忙看看到底是哪里的錯?
第一個亂數9,取第二個亂數時,原始的亂數是9,重新生成亂數還是9,再次重新生成是7,重復幾次判斷之后,忽然該亂數變回了原來的9。
i:0 temp: 9 n:0 tmp:9 n:1 tmp:9 return:9
i:1 temp: 9 n:0 tmp1: 9 n:0 tmp1: 7 n:0 tmp:7 n:1 tmp:7 return:7 tmp:7 n:1 tmp:7 return:7 tmp:9 n:1 tmp:9 return:9
二層遞回沒有問題,第一個亂數6,取第二個亂數時,原始的亂數是6,重新生成亂數還是4,不重復就直接回傳了值4。
i:0 temp: 6 n:0 tmp:6 n:1 tmp:6 return:6
i:1 temp: 6 n:0 tmp1: 4 n:0 tmp:4 n:1 tmp:4 return:4 tmp:4 n:1 tmp:4 return:4
uj5u.com熱心網友回復:
生成不重復亂數,試試public int[] getRandomNum1(int num, int minValue, int maxValue)
{
if (maxValue - minValue < num)
{
throw new Exception("設定不正確");
}
Random ra = new Random();
HashSet<int> hashInt = new HashSet<int>();
for (int i = 0; i < num; i++)
{
while (true)
{
int value = ra.Next(minValue, maxValue);
if (!hashInt.Contains(value))
{
hashInt.Add(value);
break;
}
}
}
return hashInt.ToArray();
}
uj5u.com熱心網友回復:
代碼太長了。。。。如果只是隨機 1-10的2個不重復亂數。
那么直接 如下,思路是把1-10隨機排列,取出前兩個。
var q = Enumerable.Range(1, 10).OrderBy(x => Guid.NewGuid()).Take(2);
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/3706.html
標籤:C#
上一篇:C# WPF OxyPlot 添加滑鼠可以移動的縱向標識
下一篇:C#MVC 發帖問題
