XNA随机选择纹理总是选择相同的纹理

smo*_*med 2 c# xna windows-phone-7 xna-4.0

我制作了这段代码,将大约8种不同的纹理加载到具有纹理属性的对象列表中.

我有一个名为"1.png,2.png,3.png,.......,46.png"的纹理文件夹,我希望8个不同的对象加载随机选择的纹理.

        DockedFruitsList = new List<Fruit>(8);
        for (int i = 0; i < 8; i++)
        {
            Fruit temp = new Fruit();
            temp = new Fruit();
            temp.Position = AvailablePositions[i];
            int random=(new Random().Next(0, 4600) % 46);
            temp.Texture = Content.Load<Texture2D>(@"Fruits/" + random);
            DockedFruitsList.Add(temp);          

        }
Run Code Online (Sandbox Code Playgroud)

问题是,尽管随机总是生成不同的数字,但绘制的结果始终是相同的纹理,它从运行变为另一个运行,但对于所有8个纹理它总是相同的

spriteBatch.Begin();
        for (int i = 0; i < DockedFruitsList.Count; i++)
        {
            spriteBatch.Draw(DockedFruitsList[i].Texture, DockedFruitsList[i].Position, Color.White);
        }
        spriteBatch.End();
Run Code Online (Sandbox Code Playgroud)

por*_*ges 5

试试这个:

for (int i = 0; i < 100; i++)
    Console.WriteLine(new Random().Next(0, 10));
Run Code Online (Sandbox Code Playgroud)

赔率是你会得到这样的输出:

5
5
5
.
.
.
Run Code Online (Sandbox Code Playgroud)

这是因为Random使用基于时间的值初始化类的种子.如果你Random在同一个时间点附近初始化类的许多实例,那么它们都将以相同的种子结束,因此它们将产生的值将是相同的.

您真正想要做的是创建一个 Random实例并将其用于所有随机值.生成的值将彼此无关:

var r = new Random();
for (int i = 0; i < 100; i++)
    Console.WriteLine(r.Next(0, 10));
Run Code Online (Sandbox Code Playgroud)

输出:

2
8
0
.
.
.
Run Code Online (Sandbox Code Playgroud)

  • 如果您在调试暂停时执行此操作,则时钟有机会更改. (2认同)