生成不重复的随机数的三种方法
生活随笔
收集整理的這篇文章主要介紹了
生成不重复的随机数的三种方法
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
下面我以生成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());?????????????? ?
??????? }
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()); ?
??????? }
??? 這個方法減少了一層循環嵌套,效率上有一定的改善!
3,通過隨機排序來實現
?? 這種方法徹底的顛覆了方法1和2的基本思路,先初始化一個包含數字1-10的數組,然后每次循環取一個隨機位置,將這個位置的元素和最后一個位置的元素交換!實例代碼如下:
??????? static void Main(string[] args)
??????? {
??????????? int[] result = new int[10];
??????????? for (int i = 0; i < 10; i++)
??????????????? result[i] = i + 1;
??????????? for (int j = 9; j > 0; j--)
??????????? {
??????????????? Random r = new Random();
??????????????? int index = r.Next(0, j);
??????????????? int temp = result[index];
??????????????? result[index] = result[j];
??????????????? result[j] = temp;
??????????? }
??????????? for (int i = 0; i < 10; i++)
??????????????? Console.WriteLine(result[i].ToString());
?????????????? ?
??????? }
這種方法消除了循環嵌套,效率上獲得了進一步的改善,但是也有一定的限制,如果要生成5個1-10之間的隨機數,那這種打亂順序的方法就無法使用了!
總結:方法1效率比較低下,一般不推薦使用!
????? 方法2比較通用,效率高于方法1,但是效率低于方法3
????? 方法3雖然效率比較高,但是只能應用與特定的情況下!
請大家多多指教啊!
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());?????????????? ?
??????? }
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()); ?
??????? }
??? 這個方法減少了一層循環嵌套,效率上有一定的改善!
3,通過隨機排序來實現
?? 這種方法徹底的顛覆了方法1和2的基本思路,先初始化一個包含數字1-10的數組,然后每次循環取一個隨機位置,將這個位置的元素和最后一個位置的元素交換!實例代碼如下:
??????? static void Main(string[] args)
??????? {
??????????? int[] result = new int[10];
??????????? for (int i = 0; i < 10; i++)
??????????????? result[i] = i + 1;
??????????? for (int j = 9; j > 0; j--)
??????????? {
??????????????? Random r = new Random();
??????????????? int index = r.Next(0, j);
??????????????? int temp = result[index];
??????????????? result[index] = result[j];
??????????????? result[j] = temp;
??????????? }
??????????? for (int i = 0; i < 10; i++)
??????????????? Console.WriteLine(result[i].ToString());
?????????????? ?
??????? }
這種方法消除了循環嵌套,效率上獲得了進一步的改善,但是也有一定的限制,如果要生成5個1-10之間的隨機數,那這種打亂順序的方法就無法使用了!
總結:方法1效率比較低下,一般不推薦使用!
????? 方法2比較通用,效率高于方法1,但是效率低于方法3
????? 方法3雖然效率比較高,但是只能應用與特定的情況下!
請大家多多指教啊!
轉載于:https://www.cnblogs.com/xuefeng1982/archive/2010/07/22/1783238.html
總結
以上是生活随笔為你收集整理的生成不重复的随机数的三种方法的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Mini 容器介绍
- 下一篇: Head.First.Object-Or