C#程序仅在步进模式下正常工作

时间:2016-05-12 17:48:13

标签: c# debugging

using System;
using System.Linq;

namespace Loto
{
    class Program
    {
        static void Main(string[] args)
        {
            short[] tirage = new short[6]; //array that contains the numbers
            short nbTirage; //the number randomed

            for (int i = 0; i < 6; i++)
            {
                nbTirage = NombreAleatoire();

                while (tirage.Contains(nbTirage)) //if the number has already been drawn
                {
                    nbTirage = NombreAleatoire(); //we random another one
                }

                Console.Write(nbTirage + " "); //writing the result
            }
        }

        static short NombreAleatoire()
        {
            Random nb = new Random();
            return (short)nb.Next(1, 49);
        }
    }
}

这是完整的计划。

应该在1到49之间绘制7个唯一数字。该程序在调试模式下运行良好,但是当我从exe运行它时,它会绘制相同数量的7倍。是什么造成的?我正在使用Visual Studio。

2 个答案:

答案 0 :(得分:5)

快速连续创建一个新的Random对象会为该对象的每个实例提供相同的(基于时间的)种子,因此它们都将生成相同的数字。

使用Random单个实例生成正在进行的数字。像这样:

Random nb = new Random();
for (int i = 0; i < 6; i++)
{
    nbTirage = (short)nb.Next(1, 49);

    while (tirage.Contains(nbTirage)) //if the number has already been drawn
    {
        nbTirage = (short)nb.Next(1, 49); //we random another one
    }

    Console.Write(nbTirage + " "); //writing the result
}

(注意:你在调试模式下遇到同样的行为,如果你没有暂停执行代码。Random的种子是因此,通过暂停执行代码,您可以节省时间,从而更改种子。删除所有断点并让应用程序在调试模式下完全执行,您将看到在发布模式下看到的相同行为。)

答案 1 :(得分:2)

这是因为Random的默认种子是你每次迭代播种时的时间。您需要传入Random对象以确保获得不同的数字。

它正在调试步骤中,因为迭代之间的时间要慢得多,所以种子正在改变。

Random nb = new Random();

for (int i = 0; i < 6; i++)
{
    nbTirage = NombreAleatoire(nb);

    while (tirage.Contains(nbTirage)) //if the number has already been drawn
    {
        nbTirage = NombreAleatoire(nb); //we random another one
    }

    Console.Write(nbTirage + " "); //writing the result
}

static short NombreAleatoire(Random nb)
{
    return (short)nb.Next(1, 49);
}