“怎么好;这是生成随机数的方法

本文关键字:随机数 方法 怎么好 | 更新日期: 2023-09-27 18:14:15

我在谷歌上搜索RNGCryptoServiceProvider,并举例说明如何限制Max和Min之间的范围,并且仍然得到均匀分布。在我使用模运算符之前,但有时我会得到奇怪的值(高于Max)…无论如何,这段代码(信用未知)从RNGCCryptoServiceProvider随机种子一个新的种子,每次方法被调用。你们怎么看?

public static int GetRandom(int min, int max)
{
  byte[] b = new byte[sizeof(int)];
  new System.Security.Cryptography.RNGCryptoServiceProvider().GetBytes(b);
  int i = BitConverter.ToInt32(b, 0);
  Random r = new Random(i);
  return r.Next(min, max);
}

“怎么好;这是生成随机数的方法

使用加密类随机生成器作为常规随机生成器的种子是没有意义的。(根据最薄弱环节原则……)只使用随机生成器的一个实例,并重用它:

private static Random rnd = new Random();
public static int GetRandom(int min, int max) {
  return rnd.Next(min, max);
}

您将需要创建一次RNGCryptoServiceProvider对象,然后在每次需要新的随机数时重用该对象。例如,您可以将上述对象传递到GetRandom()方法中,也可以将其存储在类级字段中。

RNGCryptoServiceProvider类型本身而言,它自己生成好的数字,不需要创建Random对象并传入种子。这会给你一个非常不错的分布:

public static int GetRandom(RNGCryptoServiceProvider rngProvider, int min, int max)
{
    byte[] b = new byte[sizeof(UInt32)];
    rngProvider.GetBytes(b);
    double d = BitConverter.ToUInt32(b, 0) / (double)UInt32.MaxValue;
    return min + (int)((max - min) * d);
}

在应用程序中只播种一次随机数生成器是一种更好的做法。我建议您创建一个静态类来生成随机数。随机生成对象只需正常使用即可产生均匀分布。我不知道用RNGCryptoServiceProvider来播种生成器有什么好处。我喜欢像往常一样使用时间播种法。因此,下面的代码是我的建议:

int randomNumber=Rand.get(min,max);
public static class Rand
{
    private static Random rnd;
    static rand()
    {
        rand=new Random(DateTime.Now.Ticks);
    }
    public static int get(int min,int max)
    {
        return rnd.Next(min,max);
    }
}