Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/asp.net/33.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# ASP.NET MVC循环似乎不起作用_C#_Asp.net_.net_Asp.net Mvc_Debugging - Fatal编程技术网

C# ASP.NET MVC循环似乎不起作用

C# ASP.NET MVC循环似乎不起作用,c#,asp.net,.net,asp.net-mvc,debugging,C#,Asp.net,.net,Asp.net Mvc,Debugging,我正在建立一个类似验证码的功能,我有一个方法来画随机线 private Graphics DrawRandomLines(Graphics g) { SolidBrush green = new SolidBrush(Color.Green); int count = 0; for (int i = 0; i < 20; i++) { g.DrawLines(new Pen(green, 2),

我正在建立一个类似验证码的功能,我有一个方法来画随机线

private Graphics DrawRandomLines(Graphics g)
    {
        SolidBrush green = new SolidBrush(Color.Green);
        int count = 0;
        for (int i = 0; i < 20; i++)
        {
            g.DrawLines(new Pen(green, 2), GetRandomPoints());
            count++;
        }

        return g;
    }

问题在于,您正在为20个点中的每个点实例化一个新的
Random
对象。时间差太小,“随机”值不够随机。调试应用程序时,您会“暂停”以检查值,并且系统时钟会前进,因此新的
随机
对象的种子与以前的不同。底线是,你画的20条线,只是它们有相同的位置,也就是说,它们画在彼此的上面

更改为:

private Graphics DrawRandomLines(Graphics g)
{
    SolidBrush green = new SolidBrush(Color.Green);
    int count = 0;
    //instantiate only one time
    Random rand = new Random();
    //same here
    Pen greenPen = new Pen(green, 2);
    for (int i = 0; i < 20; i++)
    {
        g.DrawLines(greenPen, GetRandomPoints(rand));
        count++;
    }

    return g;
}

private Point[] GetRandomPoints(Random rand)
{
    Point[] points = { new Point(rand.Next(0, 100), 
                       rand.Next(0, 30)), 
                       new Point(rand.Next(0, 100), 
                       rand.Next(0, 30)) };
    return points;
}
专用图形绘制线(图形g)
{
SolidBrush绿色=新的SolidBrush(颜色为绿色);
整数计数=0;
//只实例化一次
Random rand=新的Random();
//这里也一样
绿色钢笔=新钢笔(绿色,2);
对于(int i=0;i<20;i++)
{
g、 抽绳(绿色笔、随机点(兰特));
计数++;
}
返回g;
}
私有点[]获取随机点(随机兰德)
{
点[]点={新点(rand.Next(0100),
兰德下一个(0,30)),
新点(下一个兰特(01100),
rand.Next(0,30))};
返回点;
}

问题在于,您正在为20个点中的每个点实例化一个新的
随机
对象。时间差太小,“随机”值不够随机。调试应用程序时,您会“暂停”以检查值,并且系统时钟会前进,因此新的
随机
对象的种子与以前的不同。底线是,你画的20条线,只是它们有相同的位置,也就是说,它们画在彼此的上面

更改为:

private Graphics DrawRandomLines(Graphics g)
{
    SolidBrush green = new SolidBrush(Color.Green);
    int count = 0;
    //instantiate only one time
    Random rand = new Random();
    //same here
    Pen greenPen = new Pen(green, 2);
    for (int i = 0; i < 20; i++)
    {
        g.DrawLines(greenPen, GetRandomPoints(rand));
        count++;
    }

    return g;
}

private Point[] GetRandomPoints(Random rand)
{
    Point[] points = { new Point(rand.Next(0, 100), 
                       rand.Next(0, 30)), 
                       new Point(rand.Next(0, 100), 
                       rand.Next(0, 30)) };
    return points;
}
专用图形绘制线(图形g)
{
SolidBrush绿色=新的SolidBrush(颜色为绿色);
整数计数=0;
//只实例化一次
Random rand=新的Random();
//这里也一样
绿色钢笔=新钢笔(绿色,2);
对于(int i=0;i<20;i++)
{
g、 抽绳(绿色笔、随机点(兰特));
计数++;
}
返回g;
}
私有点[]获取随机点(随机兰德)
{
点[]点={新点(rand.Next(0100),
兰德下一个(0,30)),
新点(下一个兰特(01100),
rand.Next(0,30))};
返回点;
}

每次调用GetRandomPoints时,该函数都会创建一个新的随机对象,该对象将使用当前时钟时间进行种子设定

当您在释放模式下运行此操作时,对GetRandomPoints的20个调用发生得如此之快,以至于所有20个随机对象都使用完全相同的值作为种子,因此它们都产生相同的“随机”数。你画了二十条线——它们完全一样

但是,当您在调试模式下运行此程序时,添加的所有调试代码都会减慢速度,使随机对象获得不同的种子值,因此生成的随机数也不同


要解决这个问题,您需要从创建二十个不同的随机对象(这可能会使它们的种子相同)过渡到创建一个可重用的随机对象。要做到这一点,不要在GetRandomPoints中创建随机对象-而是将其作为参数,并在DrawRandomLines中创建它。

每次调用GetRandomPoints时,该函数都会创建一个新的随机对象,该对象将使用当前时钟时间进行种子设定

当您在释放模式下运行此操作时,对GetRandomPoints的20个调用发生得如此之快,以至于所有20个随机对象都使用完全相同的值作为种子,因此它们都产生相同的“随机”数。你画了二十条线——它们完全一样

但是,当您在调试模式下运行此程序时,添加的所有调试代码都会减慢速度,使随机对象获得不同的种子值,因此生成的随机数也不同


要解决这个问题,您需要从创建二十个不同的随机对象(这可能会使它们的种子相同)过渡到创建一个可重用的随机对象。为此,不要在GetRandomPoints中创建随机对象,而是将其作为参数,并在DrawRandomLines中创建它。

可以显示GetRandomPoints吗?很可能是因为线程安全,看看你能不能显示GetRandomPoints?很可能是由于线程安全,请看一下,当您创建
随机
对象时,它会使用当前系统时钟初始化。此初始值(种子)用于生成(伪)随机值。如果您以足够快的速度声明多个
Random
对象,它们都将使用相同的种子进行初始化,并生成相同的“随机数”序列。根据经验法则,
Random
对象应在每个类/应用程序中声明一次,或在每个“随机数集”(例如,您的随机点)中至少声明一次,而不是针对每个随机数。这是因为
Random
对象初始化一次,连续的随机数产生不同的值。创建
Random
对象时,它会使用当前系统时钟初始化。此初始值(种子)用于生成(伪)随机值。如果您以足够快的速度声明多个
Random
对象,它们都将使用相同的种子进行初始化,并生成相同的“随机数”序列。根据经验法则,
Random
对象应在每个类/应用程序中声明一次,或在每个“随机数集”(例如,您的随机点)中至少声明一次,而不是针对每个随机数。这是因为
Random
对象初始化一次,连续的随机数产生不同的值。