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

4
我正在尝试在for循环内创建一个自定义对象的新实例。如果我添加断点,我可以看到对象和属性的更改,并返回x个不同的蜡烛对象。然而,如果我删除断点,列表中返回的所有对象都是相同的。有什么想法吗?
谢谢
    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个回答

8
您没有为随机数生成器提供种子。您应该在所有对next的调用中共享相同的随机实例:
var randomGenerator = new Random(DateTime.Now.Milliseconds);

然后,只需调用一个生成器:
dp.x = randomGenerator.Next(0000, 9999);
dp.y = randomGenerator.Next(0000, 9999);

这样,您已经向生成器中种入了一些内容,并且每次调用next都应该生成一个新的“随机”数字。


2
Sam正在为RNG播种,但是由于循环非常快,所以使用相同的种子(时间)。因此,每个“candle”的实例都会产生相同的数字。 - Matt Ellen
Sam,在当前代码上使用断点是有效的,因为它会添加延迟并更改Random实例的“种子”。 - BenCr

1

System.Random(): 来自 MSDN

使用基于时间的默认种子值初始化 Random 类的一个新实例。

没有调试器,你太快了。

试试这个:

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;

}

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;
  } 

0
将新的 Random() 放在 for 循环外面。
    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;

    }

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接