随机字符生成错误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

随机字符生成错误C#

您需要将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;
}

两个问题:

  1. 您不需要Random类的多个实例:charSelectionnumSelection是多余的
  2. 实例化随机类一次,不在while循环内

[编辑]

8-4-4-11格式:

var guidText = Guid.NewGuid().ToString();
var customGuid = guidText.Substring(0, 18) + guidText.Substring(23, 12);