在.NET Framework环境下生成真随机数
这里仅讨论.NET Framework环境下的情况,在.NET Core中有变化。
真随机数是相对于伪随机数生成类 Random 的。
电脑产生的随机数都是算法生成的,简单的Random类默认使用系统时间刻度作用种子生成随机数,因此如果在并发情况下两个实例产生的随机数有可能相同,也就是说有可能被预测(随机数序列可被预测会导致很严重的漏洞,例如曾经有扑克牌游戏网站由于使用了可以被预测的随机数发生器来实现随机发牌而导致的安全漏洞)。
所以可以使用RNGCryptoServiceProvider的实现类RandomNumberGenerator来生成随机数,它不仅仅使用单一的系统时间元素来生成随机数,还包含了Process ID、Thread ID以及大量系统信息。
1 public static int Next(this RandomNumberGenerator generator, int min, int max) 2 { 3 // match Next of Random 4 // where max is exclusive 5 max = max - 1; 6 7 var bytes = new byte[sizeof(int)]; // 4 bytes 8 generator.GetNonZeroBytes(bytes); 9 var val = BitConverter.ToInt32(bytes, 0); 10 // constrain our values to between our min and max 11 // https://stackoverflow.com/a/3057867/86411 12 var result = ((val - min) % (max - min + 1) + (max - min + 1)) % (max - min + 1) + min; 13 return result; 14 }