Random()不生成新的随机数

本文关键字:随机数 Random | 更新日期: 2023-09-27 18:17:42

对此有任何帮助或见解将不胜感激。我还是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);
}

Random()不生成新的随机数

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

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

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

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

你已经像这样声明了rand变量Random rand = new Random();这是不应该做的让rand变量成为静态变量并在你的类中声明它而不是在你的方法中这时你就不会有这样的麻烦了