随机字符生成错误C#
本文关键字:错误 字符 随机 | 更新日期: 2023-09-27 17:57:56
由于某种原因,当我尝试同时生成此代码时,该代码会一次又一次(30次)生成相同的数字或字母-请参阅下文。然而,当我在调试模式下逐行检查时,代码工作得很好。。。
private string Generate_ActiveX_name()
{
StringBuilder charBuilder = new StringBuilder("abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ");
StringBuilder numBuilder = new StringBuilder("0123456789");
//
// Holds Active X Key (final)
//
StringBuilder activeX_builder = new StringBuilder();
// Determine charactar or number
while (activeX_builder.Length < 30)
{
Random activeX_gen = new Random();
switch (activeX_gen.Next(0, 2))
{
case 0:
Random charSelection = new Random();
int CharSelected = charSelection.Next(0, 53);
activeX_builder.Append(charBuilder[CharSelected]);
break;
case 1:
Random numSelection = new Random();
int NumSelected = numSelection.Next(0, 10);
activeX_builder.Append(numBuilder[NumSelected]);
break;
}
}
string activeX_key = activeX_builder.ToString().Substring(0, 8) + "-";
activeX_key += activeX_builder.ToString().Substring(8, 4) + "-";
activeX_key += activeX_builder.ToString().Substring(12, 4) + "-";
activeX_key += activeX_builder.ToString().Substring(16, 11);
return activeX_key;
}
当我一次运行完所有代码时,为什么这个代码会失败?
谢谢,Evan
您需要将Random
构造函数移出循环。更改此项:
while (activeX_builder.Length < 30)
{
Random activeX_gen = new Random();
收件人:
Random activeX_gen = new Random();
while (activeX_builder.Length < 30)
{
问题是,当创建Random
的实例时,它使用当前系统时钟作为随机数生成的"种子"值。由于你的程序运行得很快,每次都会选择相同的种子,所以你会得到相同的"随机"值。当你调试时,你会放慢速度(通过步进),在每个循环中选择不同的种子,你会得到真正的随机值。
如果您将其移出循环,那么将创建一个Random
实例,这将导致随机分布(并提高效率!)。
似乎您正在尝试生成GUID。
你可以用一行做到这一点
var guid = Guid.NewGuid();
然而,以下是对您的代码的修复:
private static string Generate_ActiveX_name()
{
StringBuilder charBuilder = new StringBuilder("abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ");
StringBuilder numBuilder = new StringBuilder("0123456789");
StringBuilder activeX_builder = new StringBuilder();
Random activeX_gen = new Random();
while (activeX_builder.Length < 30)
{
switch (activeX_gen.Next(0, 2))
{
case 0:
int CharSelected = activeX_gen.Next(0, 53);
activeX_builder.Append(charBuilder[CharSelected]);
break;
case 1:
int NumSelected = activeX_gen.Next(0, 10);
activeX_builder.Append(numBuilder[NumSelected]);
break;
}
}
string activeX_key = activeX_builder.ToString().Substring(0, 8) + "-";
activeX_key += activeX_builder.ToString().Substring(8, 4) + "-";
activeX_key += activeX_builder.ToString().Substring(12, 4) + "-";
activeX_key += activeX_builder.ToString().Substring(16, 11);
return activeX_key;
}
两个问题:
- 您不需要Random类的多个实例:
charSelection
和numSelection
是多余的 - 实例化随机类一次,不在while循环内
[编辑]
8-4-4-11格式:
var guidText = Guid.NewGuid().ToString();
var customGuid = guidText.Substring(0, 18) + guidText.Substring(23, 12);