c# - 随机字符生成错误 C#

标签 c# debugging random

出于某种原因,当我尝试一次生成此代码时,该代码会一遍又一遍地生成相同的数字或字母(30 次) - 见下文。然而,当我在 Debug模式下逐行查看时,代码运行得很好......

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;

}

为什么当我一次性运行这段代码时会失败?

谢谢, 埃文

最佳答案

您需要将Random 构造函数移出循环。更改此:

while (activeX_builder.Length < 30)
{
    Random activeX_gen = new Random();

致:

Random activeX_gen = new Random();
while (activeX_builder.Length < 30)
{

问题是,当创建 Random 实例时,它使用当前系统时钟作为随机数生成的“种子”值。由于您的例程运行得非常快,因此每次都会选择相同的种子,因此您会获得相同的“随机”值。当您进行调试时,您会(通过逐步)减慢速度,以便在每个循环中选择不同的种子,并且您会获得真正的随机值。

如果将其移出循环,则会创建一个Random 实例,这将导致随机分布(并且效率更高!)。

关于c# - 随机字符生成错误 C#,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6182582/

相关文章:

c# - 创建新任务时取消所有任务

c# - 是否可以在空的 ASP.NET Core Mvc 项目中打开身份验证?

c# - 在 WPF 中使用 HashSets 和 ObservableCollection

c# - 我可以调试一个 Exe

c++ - 如何检测整个周期的C++随机引擎已经被消耗

c++ - Mersenne Twister 与 Mersenne Twister 64 位

Ruby #detect 使用随机数的行为

C# Montouch/Xamarin - 相机快门速度

r - 调试 R 中加载的 Rcpp 编译代码(在 OS X Mavericks 上)有哪些有效方法?

debugging - MiniDumpWriteDump() 函数的参数 : Why do we need a handle and an ID?