C# 使用范围为0到n的RNGCryptoServiceProvider生成随机数列表

C# 使用范围为0到n的RNGCryptoServiceProvider生成随机数列表,c#,C#,如何使用RNGCryptoServiceProvider 我想编辑范围内的数字,例如0到n个数字?如果问题是用给定的数字构造一个随机值 byte[] Results = new byte[n] do { yourCryptoServiceProvider.GetBytes(Results); } while (!Results.Distinct().SequenceEqual(Results)) 数字,解决方案可以是逐位组合值: static RNGCryptoServiceProvi

如何使用
RNGCryptoServiceProvider


我想编辑范围内的数字,例如0到n个数字?

如果问题是用给定的数字构造一个随机值
byte[] Results = new byte[n]
do
{
    yourCryptoServiceProvider.GetBytes(Results);
}
while (!Results.Distinct().SequenceEqual(Results))
数字,解决方案可以是逐位组合值:

static RNGCryptoServiceProvider provider = new RNGCryptoServiceProvider();

public static int NextRandomDigit() {
  Byte[] bytes = new Byte[1];

  while (true) {
    provider.GetBytes(bytes);

    // since GetBytes returns value in a range of [0..255], we should skip [250..255]
    // in order to value % 10 being uniformly distributed
    if (bytes[0] >= 250)
      continue;

    return bytes[0] % 10;
  }
}

// Constructing long digit by digit
// Assuming that numberOfDigits is small enough (18 or less) 
// for returning value being of type long
public static long NextRandomLong(int numberOfDigits) {
  long result = 0;

  for (int i = 0; i < numberOfDigits; ++i)
    result = result * 10 + NextRandomDigit();

  return result;
}

// Constructing number in String representation digit by digit
public static String NextRandomString(int numberOfDigits) {
  StringBuilder Sb = new StringBuilder();

  for (int i = 0; i < numberOfDigits; ++i)
    Sb.Append((Char) ('0' + NextRandomDigit()));

  return Sb.ToString();
}
static RNGCryptoServiceProvider=new RNGCryptoServiceProvider();
公共静态int NextRandomDigit(){
字节[]字节=新字节[1];
while(true){
provider.GetBytes(字节);
//由于GetBytes返回的值在[0..255]范围内,因此我们应该跳过[250..255]
//为了使值%10均匀分布
如果(字节[0]>=250)
继续;
返回字节[0]%10;
}
}
//逐位构造长数字
//假设numberOfDigits足够小(18或更少)
//用于返回long类型的值
公共静态长NextRandomLong(整数位数){
长结果=0;
对于(int i=0;i
小心:因为所有数字都是同样可能的,所以
以零开始的值,如“0012861542”

@Jon,这不是重复的,您引用的帖子使用的是System.Random类。RNGCryptoServiceProvider有一个不同的接口,需要一个完全不同的解决方案。@ChrisTaylor:这不是重点。关键是,使用加密强度随机性来选择唯一的数字会取消其加密强度属性。因此,您只需简单地(例如,Fischer Yates)洗牌并选择您想要的任意多个(保证唯一)数字;这个问题被误导了。嗨,我想用
RNGCryptoServiceProvider
来列出随机数8902347165 1283837881 3338939333。8345784213每个数字长度的大小相同,如果你能告诉我怎么做,谢谢。@请注意,你应该在你的问题中添加你想要的细节。