2

对此的任何帮助或见解将不胜感激。仍然是 c# 的菜鸟,所以请多多包涵。这是我的问题:

List<Vector2> vectorList = new List<Vector2>();

for (int i = 0; i < 5; i++)
{
    Vector2 tempVector = new Vector2(i, i);
    vectorList.Add(tempVector);
}

这很好用,我得到的输出是 5 个具有以下值的向量:(0, 0), (1, 1), (2, 2).. 等等......

我需要得到随机位置,所以我自己做了一个叫做 RandomizePosition() 的小函数。

for (int i = 0; i < 5; i++)
{
    Vector2 tempVector = RandomizePosition();
    vectorList.Add(tempVector);
}

我从中得到的输出是 5 个向量,包含所有相同的位置。我猜有一个引用问题,或者该函数只被调用一次或什么的。奇怪的是,如果我在调试模式下遍历每个循环,输出就是我所期望的,5 个具有不同 X 和 Y 值的向量,所以我猜这个函数不是问题。(或者更确切地说,它可能是,但不是其中的随机逻辑)。

关于为什么会发生这种情况的任何想法,以及有关如何解决此问题的一些见解?你不能从循环中调用一个函数吗?或者我如何确保每次迭代都调用该函数?谢谢!

这是 RandomizePosition() 函数,如果有帮助的话:

private Vector2 RandomizePosition()
{
   Random rand = new Random();

   int seedX = rand.Next(1, 14);
   int seedY = rand.Next(1, 14);

   int posX = 32;
   int posY = 32;

   if (seedX != 1)
       posX += seedX * 64;

   if (seedY != 1)
       posY += seedY * 64;

   return new Vector2(posX, posY);
}
4

2 回答 2

3

您还没有展示您的RandomizePosition()方法,但很可能您正在快速连续地使用相同的时间种子调用 randomise,即在您的方法中 创建Random对象 。RandomizePosition()

要阻止这种情况发生,请在您的方法Random之外创建对象。RandomizePosition()

更新:您现在已经显示了代码RandomizePosition(),这确实是问题所在。

正如@dlev所提到的,您在单步执行代码时看到预期行为的原因是您导致新创建的 Random() 对象有足够的时间来使用新种子(因为默认情况下它基于当前时间) 。

于 2013-06-08T05:58:24.897 回答
1

您已经像这样声明了 rand 变量Random rand = new Random();,不应该这样做 使 rand 变量成为静态变量,并在您的类中声明它而不是在您的方法中,那时您将不会遇到这样的麻烦

于 2013-06-08T06:03:38.253 回答