参考 《C# 6.0 in a Nutshell》
使用同一种子生成的随机数一样
Random r1 = new Random (1);
Random r2 = new Random (0);
Console.WriteLine (r1.Next (100) + ", " + r1.Next (100)); // 24, 11
Console.WriteLine (r2.Next (100) + ", " + r2.Next (100)); // 24, 11
默认使用系统时钟作为种子
这也导致下面代码中 r3 和 r4 的创建时间间隔过短,种子一样,生成的随机数也一样。
Random r3 = new Random();
Random r4 = new Random();
Console.WriteLine (r3.Next (100) + ", " + r3.Next (100)); // x, y
Console.WriteLine (r4.Next (100) + ", " + r4.Next (100)); // x, y
只要在 r3 和 r4 的创建过程中间隔一些耗时较长的操作就可以保证种子不一样,但这样做太麻烦了,我们用的更多的是下面的方案。
使用 Guid 作为种子
Random r5 = new Random (Guid.NewGuid().GetHashCode());
Random r6 = new Random (Guid.NewGuid().GetHashCode());
Console.WriteLine (r5.Next (100) + ", " + r5.Next (100)); // a, b
Console.WriteLine (r6.Next (100) + ", " + r6.Next (100)); // c, d
真随机数
Random 生成的随机数并不是真随机数,,NET 内置了 RandomNumberGenerator 用于生成真随机数。
var rand = System.Security.Cryptography.RandomNumberGenerator.Create();
byte[] bytes = new byte [4];
rand.GetBytes (bytes); // Fill the byte array with random numbers.
BitConverter.ToInt32 (bytes, 0).Dump ("A cryptographically strong random integer");