c#在for循环中创建对象的新实例

时间:2011-04-19 13:57:54

标签: c# object

我正在尝试在for循环中创建一个自定义对象的新实例,如果我添加一个断点,我可以看到对象和属性发生变化,它返回x个不同的蜡烛对象。但是,如果我删除断点,List中返回的所有对象都是相同的。有什么想法吗?

由于

    public List<candle> Getcandles(int can)
    {
        List<candle> dpl = new List<candle>();

        for (int i = 0; i < can; i++)
        {
            candle dp = new candle();
            dp.x = new Random().Next(0000, 9999);
            dp.y = new Random().Next(0000, 9999);              
            dpl.Add(dp);                

        }

        return dpl;

    }

4 个答案:

答案 0 :(得分:7)

你没有播种随机发生器。您应该在所有对next的调用中共享相同的随机实例:

var randomGenerator = new Random(DateTime.Now.Milliseconds);

然后,只需调用一个生成器:

dp.x = randomGenerator.Next(0000, 9999);
dp.y = randomGenerator.Next(0000, 9999);

通过这种方式,您既可以为生成器播种,也可以在每次调用next时生成一个新的“随机”数字。

答案 1 :(得分:1)

System.Random():来自MSDN

  

初始化一个新的实例   随机类,使用时间依赖   默认种子值

没有调试器,你太快了。

试试这个:

public List<candle> Getcandles(int can)
{
    List<candle> dpl = new List<candle>();
    var rnd = new Random(DateTime.Now.Milliseconds);
    for (int i = 0; i < can; i++)
    {
        candle dp = new candle();
        dp.x = rnd.Next(0000, 9999);
        dp.y = rnd.Next(0000, 9999);              
        dpl.Add(dp);                

    }

    return dpl;

}

答案 2 :(得分:0)

您在每次迭代时实例化一个新的Random()。因为循环速度非常快,所以每个Random()对象基本上都以相同的值开始,这将产生相同的结果。

将您的代码更改为:

public List<candle> Getcandles(int can)     {
     List<candle> dpl = new List<candle>();
      Random generator = new Random();

      for (int i = 0; i < can; i++)         {
         candle dp = new candle();
         dp.x = generator.Next(0000, 9999);
         dp.y = generator.Next(0000, 9999);
         dpl.Add(dp);
       }
      return dpl;
  } 

答案 3 :(得分:0)

在for循环外部使用新的Random()。

    public List<candle> Getcandles(int can)
    {
        List<candle> dpl = new List<candle>();
        var random =new Random() 

        for (int i = 0; i < can; i++)
        {
            candle dp = new candle();
            dp.x = random .Next(0000, 9999);
            dp.y = random .Next(0000, 9999);              
            dpl.Add(dp);                

        }

        return dpl;

    }