真正的随机c#生成器

时间:2011-05-27 12:55:23

标签: c#-4.0

  Random ran = new Random();
  byte tmp = (byte)ran.Next(10);

这个代码有替代品吗? 它似乎没有完全随机的行为。

3 个答案:

答案 0 :(得分:14)

出现这种情况的原因有多种。一个常见问题是在程序中创建Random类的多个实例。使用Random类时,您应该只创建一个实例并从中生成数字。文章Create better random numbers in C#很好地解释了为什么并解释了为什么不这样做可能会导致问题。

另一种常见情况是从多个线程访问Random类对象。 System.Random不是线程安全的(请参阅Random文档的Remarks section),因此可能会导致意外和不需要的行为。如果在多线程环境中使用它,那么你需要确保使用某种形式的锁定来防止多个线程同时尝试生成随机数。

对于更高程度的安全性和随机性,您可以使用加密安全随机数生成器 System.Security.Cryptography.RNGCryptoServiceProvider。请注意,与System.Random相比,使用更安全的随机数生成器会导致性能下降。

如果您不需要加密安全的东西,但仍然需要比Random类更“随机”的东西,您可以使用其他PRNG(如Mersenne Twister)进行探索。有很多选项,每个选项都有不同的特性和性能配置文件。您选择的内容在很大程度上取决于您的目标。

答案 1 :(得分:1)

它可能比那更简单。如果你能在紧密循环中使用这种方法:

for (int i = 0; i < 1000; i++)
{
   Random ran = new Random();
   byte tmp;            
   tmp = (byte)ran.Next(10);
}

您可能会反复看到相同的数字。确保在任何类型的循环之外创建Random对象。

Random ran = new Random();

for (int i = 0; i < 1000; i++)
{
   byte tmp;            
   tmp = (byte)ran.Next(10);
}

那就是说,加密提供商确实更好。但是你只能得到0和0之间的随机数。 9那么它有多随机?

答案 2 :(得分:0)

您还可以考虑random.org API

http://www.random.org/clients/http/