标签:
1) Random random = new Random(); // 无参数构造函数使用系统时钟生成其种子值
然而,系统时钟取值范围有限,因此在小规模计算中,可能无法使用不同的种子值分别调用此构造函数, 这将导致两个random对象生成相同的随机数字序列。
1 using System; 2 using System.Collections.Generic; 3 4 namespace FirstTest 5 { 6 class Program 7 { 8 static void Main(string[] args) 9 { 10 Random random1 = new Random(); 11 List<int> list1 = new List<int>(); 12 GetRandomNumbers(random1, list1); 13 Console.WriteLine("random1对象使用默认构造函数生成的随机数序列: "); 14 PrintList(list1); 15 16 Random random2 = new Random(); 17 List<int> list2 = new List<int>(); 18 GetRandomNumbers(random2, list2); 19 Console.WriteLine("random2对象使用默认构造函数生成的随机数序列: "); 20 PrintList(list2); 21 } 22 23 private static void GetRandomNumbers(Random rand, List<int> list) 24 { 25 for (int i = 1; i <= 15; i++) 26 { 27 list.Add(rand.Next(0, 100)); 28 } 29 } 30 31 private static void PrintList(List<int> list) 32 { 33 foreach (int element in list) 34 { 35 Console.Write ("{0, 5}", element); 36 } 37 Console.WriteLine(); 38 } 39 } 40 }
运行结果:
2) Random random = new Random(Int32); // 参数化构造函数使用指定的种子值初始化Random类实例,如果指定的是负数,则使用其绝对值作为时间种子。
创建随时间推移,时间种子取值范围大的 Random 对象,以确保生成多个Random对象时,彼此间的随机数序列不同。
1 Random random = new Random((int)DateTime.Now.Ticks);
运行结果:
1 Random random = new Random(GetRandomSeed()); 2 3 static int GetRandomSeed() 4 { 5 byte[] bytes = new byte[4]; 6 System.Security.Cryptography.RNGCryptoServiceProvider rng = new System.Security.Cryptography.RNGCryptoServiceProvider(); 7 rng.GetBytes(bytes); 8 return BitConverter.ToInt32(bytes, 0); 9 }
运行结果:
【C#】Random类中构造方法、时间种子与随机数序列的关系
标签:
原文地址:http://www.cnblogs.com/muxiaomo/p/4480790.html