C# XNA随机选择的纹理始终拾取相同的纹理

C# XNA随机选择的纹理始终拾取相同的纹理,c#,windows-phone-7,xna,xna-4.0,C#,Windows Phone 7,Xna,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

我编写了这段代码,将大约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);          

        }
dockdfruitslist=新列表(8);
对于(int i=0;i<8;i++)
{
水果温度=新水果();
温度=新水果();
温度位置=可用位置[i];
int random=(new random().Next(04600)%46);
温度纹理=内容加载(@“水果/”+随机);
DockedFruitsList.Add(临时);
}
问题是,尽管random始终生成不同的数字,但绘制的结果始终是相同的纹理,它从一次运行更改为另一次运行,但所有8个纹理的结果始终相同

spriteBatch.Begin();
        for (int i = 0; i < DockedFruitsList.Count; i++)
        {
            spriteBatch.Draw(DockedFruitsList[i].Texture, DockedFruitsList[i].Position, Color.White);
        }
        spriteBatch.End();
spriteBatch.Begin();
对于(int i=0;i
来自msdn:

随机数生成从种子值开始。 如果重复使用同一种子,则生成相同的数字序列。 默认情况下,Random类的无参数构造函数使用系统时钟生成其种子值

它使用的系统时钟只会每隔几毫秒更改其值,因此,如果您非常快地调用
new Random()
,它将使用相同的数字作为种子,因此对
Next…
的调用将产生相同的结果

请注意,如果您对其进行调试,单步执行代码会给系统时钟提前时间,因此您不会得到错误,除非它在循环中运行而您没有中断/单步执行。


创建
Random
对象一次,然后重新使用它(注意,我现在正在将
Random
转换为string,并且我也调用了一个不同的Random方法):

var rand=new Random();
DockedFruitsList=新列表(8);
对于(int i=0;i<8;i++)
{
水果温度=新水果();
温度=新水果();
温度位置=可用位置[i];
int random=(rand.Next(46)+1);
temp.Texture=Content.Load(@“Fruits/”+random.ToString());
DockedFruitsList.Add(临时);
}
试试这个:

for (int i = 0; i < 100; i++)
    Console.WriteLine(new Random().Next(0, 10));
这是因为
Random
类的种子是用基于时间的值初始化的。如果您在同一时间点附近初始化了
Random
类的多个实例,那么它们都将以相同的种子结束,因此它们将生成的值都是相同的

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

var r = new Random();
for (int i = 0; i < 100; i++)
    Console.WriteLine(r.Next(0, 10));
意味着您每次初始化rng(可能使用相同的种子?)
将新成员移到方法外部(静态成员或类似对象)。

Random
按时间(
GetTickCount()
)播种,时间仅每隔几毫秒更改一次。因此,在该时间间隔内创建的所有random实例都将返回相同的序列。正确的做法是只在循环外创建一个
Random
的实例

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

        }

使用
Shuffle
from

我已经确定随机数的输出是不同的数字,问题在于内容的执行。Load(@“Fruits/”+random);如果在调试暂停时执行此操作,则时钟有机会更改。他还需要
ToString
随机变量。@George
ToString
不是必需的<代码>+
在C#中的
string+int
上重载。啊,我不知道。谢谢
var r = new Random();
for (int i = 0; i < 100; i++)
    Console.WriteLine(r.Next(0, 10));
2
8
0
.
.
.
new Random().Next(0, 4600)
        DockedFruitsList = new List<Fruit>(8);
        Random rand = new Random();
        for (int i = 0; i < 8; i++)
        {
            Fruit temp = new Fruit();
            temp = new Fruit();
            temp.Position = AvailablePositions[i];
            int random=(rand.Next(1, 46));
            temp.Texture = Content.Load<Texture2D>(@"Fruits/" + random);
            DockedFruitsList.Add(temp);          

        }
Random rand=new Random();
foreach(int randomFruid in Range(1,46).Shuffle(rand).Take(8))
{
   ...
}