Random类
构造函数
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对象时,彼此间的随机数序列不同。
- 通常情况下使用计时周期数(Ticks)作为时间种子:
1 Random random = new Random((int)DateTime.Now.Ticks);
运行结果:
- 或者,通过加密随机数生成器(RNG)生成时间种子:
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 }
运行结果:
来源:oschina
链接:https://my.oschina.net/u/4299887/blog/4280290