生成不重復的隨機數的二種方法
下面我以生成1-10之間的10個不重復的隨機數為例介紹生成不重復的隨機數的三種方法:
1. 通過while循環來實現
通過while循環不停的生成隨機數,直到生成一個不重復的為止,這種方法比較容易想到,但是效率也比較低下,實例代碼如下:
static void Main(string[] args)
{
int[] result = new int[10];
int tmp = -1;
Random random = new Random();
bool repeat = false;
for (int i = 0; i < 10; i++)
{
repeat = true;
while (repeat)
{
repeat = false;
tmp = random.Next(1, 11);
for (int j = 0; j < i; j++)
{
if (tmp == result[j])
{
repeat = true;
break;
}
}
}
result[i] = tmp;
}
for (int i = 0; i < 10; i++)
Console.WriteLine(result[i].ToString());
}
{
int[] result = new int[10];
int tmp = -1;
Random random = new Random();
bool repeat = false;
for (int i = 0; i < 10; i++)
{
repeat = true;
while (repeat)
{
repeat = false;
tmp = random.Next(1, 11);
for (int j = 0; j < i; j++)
{
if (tmp == result[j])
{
repeat = true;
break;
}
}
}
result[i] = tmp;
}
for (int i = 0; i < 10; i++)
Console.WriteLine(result[i].ToString());
}
2. 通過for循環來實現
方法1使用了多處循環嵌套,效率十分低下,所以我應用一定的技巧來減少循環嵌套,來達到提高程序效率的目的。主要思路是如果檢測到重復,就把循環變量減1,這樣來重新進行一次循環,重新生成一個隨機數,直到生成一個不重復的隨機數為止,實例代碼如下:
static void Main(string[] args)
{
int[] result = new int[10];
int tmp = -1;
Random random = new Random();
bool repeat = false;
for (int i = 0; i < 10; i++)
{
repeat = false;
tmp = random.Next(1, 11);
for (int j = 0; j < i; j++)
{
if (tmp == result[j])
{
repeat = true;
break;
}
}
if (!repeat)
{
result[i] = tmp;
}
else
{
i = i - 1;//循環變量-1
}
}
for (int i = 0; i < 10; i++)
Console.WriteLine(result[i].ToString());
}
{
int[] result = new int[10];
int tmp = -1;
Random random = new Random();
bool repeat = false;
for (int i = 0; i < 10; i++)
{
repeat = false;
tmp = random.Next(1, 11);
for (int j = 0; j < i; j++)
{
if (tmp == result[j])
{
repeat = true;
break;
}
}
if (!repeat)
{
result[i] = tmp;
}
else
{
i = i - 1;//循環變量-1
}
}
for (int i = 0; i < 10; i++)
Console.WriteLine(result[i].ToString());
}
這個方法減少了一層循環嵌套,效率上有一定的改善!
總結:
方法1效率比較低下,一般不推薦使用!
方法2比較通用,效率高于方法1。
請大家多多指教啊!
全站熱搜