C# “如何”;“好”;这是生成随机数的方法吗?

C# “如何”;“好”;这是生成随机数的方法吗?,c#,random,cryptography,rngcryptoserviceprovider,C#,Random,Cryptography,Rngcryptoserviceprovider,我在google上搜索RNGCryptoServiceProvider,并举例说明如何限制最大值和最小值之间的范围,同时仍然获得均匀分布。在我使用模运算符之前,但有时会得到奇怪的值(高于最大值)。。。 不管怎样,每次调用该方法时,该代码(归功于未知)都会随机从RNGCCryptoServiceProvider中获取一个新种子。你们觉得怎么样 public static int GetRandom(int min, int max) { byte[] b = new byte[sizeof(i

我在google上搜索RNGCryptoServiceProvider,并举例说明如何限制最大值和最小值之间的范围,同时仍然获得均匀分布。在我使用模运算符之前,但有时会得到奇怪的值(高于最大值)。。。 不管怎样,每次调用该方法时,该代码(归功于未知)都会随机从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);
}

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

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
对象,然后在每次需要新的随机数时重新使用该对象。例如,您可以将所述对象传递到
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);
    }
}

在应用程序中,最好只为随机数生成器添加一次种子。 我建议您为随机数生成创建一个静态类。仅通过正常使用,随机生成对象就可以产生均匀分布。我不知道使用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);
    }
}

每次你调用你的rng时重新设定种子是不好的做法。好吧,那我怎么才能从rng中只设定一个种子?每次你调用它时重新设定你的rng种子是不好的做法。好吧,那么我怎么才能从rng中只设定一个种子?嗯,我希望它能改善随机性。Next()因为它非常方便,即使是一周。标准的
Random
只有在您将其用于加密或需要很长时间(例如在线扑克游戏)时才很弱。否则就好了。@MatthewWatson好的,我会坚持使用它,嗯,我希望它能改进Random.Next(),因为它非常方便,即使现在是一周。标准的
Random
只有在你使用它进行加密或需要很长时间(例如在线扑克游戏)时才很弱。否则就好了。@MatthewWatson好的,我就坚持下去,谢谢!我要试试这个!如果
max-min
太大而无法包含在int中,则此实现中存在整数溢出。谢谢!我要试试这个!如果
max-min
太大而无法包含在int中,则此实现中存在整数溢出。