用字母数字值生成C#中的随机数
嗨,我有这个创建随机数的代码,它工作得很好..返回随机数,但我怀疑它可能会在某个时候生成相同的数字。。请任何一个给我你的建议将有机会产生相同的数字????如果有给我一个解决方案..这是我用来创建随机数的代码集用字母数字值生成C#中的随机数,c#,random,C#,Random,嗨,我有这个创建随机数的代码,它工作得很好..返回随机数,但我怀疑它可能会在某个时候生成相同的数字。。请任何一个给我你的建议将有机会产生相同的数字????如果有给我一个解决方案..这是我用来创建随机数的代码集 public string GetUniqueKey() { int maxSize = 6; char[] chars = new char[62]; chars = "abcdefghijklmnopqrstuvwxyzABCDEFGHI
public string GetUniqueKey()
{
int maxSize = 6;
char[] chars = new char[62];
chars = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890".ToCharArray();
byte[] data = new byte[1];
using (RNGCryptoServiceProvider crypto = new RNGCryptoServiceProvider())
{
crypto.GetNonZeroBytes(data);
data = new byte[maxSize];
crypto.GetNonZeroBytes(data);
}
StringBuilder result = new StringBuilder(maxSize);
foreach (byte b in data)
{
result.Append(chars[b % (chars.Length)]);
}
return result.ToString();
}
这个例子是完全错误的。正如在原始答案的评论中所写,这个例子是有偏见的。。。另外,它创建无用的数组只是为了立即覆盖它们。。。并调用随机数方法两次。更好的例子应该是:
public static string GetUniqueKey(int size = 6, string chars = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890")
{
using (var crypto = new RNGCryptoServiceProvider())
{
var data = new byte[size];
// If chars.Length isn't a power of 2 then there is a bias if
// we simply use the modulus operator. The first characters of
// chars will be more probable than the last ones.
// buffer used if we encounter an unusable random byte. We will
// regenerate it in this buffer
byte[] smallBuffer = null;
// Maximum random number that can be used without introducing a
// bias
int maxRandom = byte.MaxValue - ((byte.MaxValue + 1) % chars.Length);
crypto.GetBytes(data);
var result = new char[size];
for (int i = 0; i < size; i++)
{
byte v = data[i];
while (v > maxRandom)
{
if (smallBuffer == null)
{
smallBuffer = new byte[1];
}
crypto.GetBytes(smallBuffer);
v = smallBuffer[0];
}
result[i] = chars[v % chars.Length];
}
return new string(result);
}
}
public静态字符串GetUniqueKey(int size=6,string chars=“abcdefghijklmnopqrstuvxyzabcdefghijklmnopqrstuvxyz1234567890”)
{
使用(var crypto=new RNGCryptoServiceProvider())
{
变量数据=新字节[大小];
//如果chars.Length不是2的幂,那么如果
//我们只是简单地使用模算子
//chars将比上一个更可能出现。
//如果遇到不可用的随机字节,将使用缓冲区。我们将
//在此缓冲区中重新生成它
字节[]smallBuffer=null;
//可使用的最大随机数,无需引入
//偏倚
int maxRandom=byte.MaxValue-((byte.MaxValue+1)%chars.Length);
加密.GetBytes(数据);
var结果=新字符[大小];
对于(int i=0;imaxRandom)
{
if(smallBuffer==null)
{
smallBuffer=新字节[1];
}
加密.GetBytes(smallBuffer);
v=小型缓冲区[0];
}
结果[i]=字符[v%字符长度];
}
返回新字符串(结果);
}
}
有一些反偏见的代码
现在,对于你的问题。。。显然,有可能生成两次相同的密钥。。。如果有62个可能的符号且大小为6,则可能的键数为62^6=56800235584。使用生日悖论,如果生成238328左右,则有50%的几率生成一个密钥两次。@M.NasserJavaid此问题中的代码实际上来自于对该问题的分析。这个问题是关于如何增加随机性(即不是重复的imo)的,请不要声称自己编写了非自己的代码。根据random的定义,很可能会生成相同的随机数(否则就不是随机数)@Petrichor sry我无法在这里发表评论这就是为什么我添加新问题来问这个问题实际上我从这个链接中获取了代码“”但我怀疑是否有机会生成相同的随机数。如果有这样的机会,请给我一个解决方案,代码是错误的,错误的,错误的。。。而且马虎。它偏向于
bcdef
。他们比其他角色更有可能。另外,它还调用了随机方法两次,创建了无用的数组,…感谢您的回复。。。。。所以我想每次都检查列是否有exist值,这是正确的方法吗?@user3396216,如果您需要它是唯一的,是的。请注意,通过使键变长,可能性变小。。。例如,对于完全随机的Guid(32x‘a-Z0-5’个字符),生成两次相同Guid的可能性在天文上很小,因此通常不进行检查。