在我的xna游戏中,我有一种方法可以在地图上的随机位置创建宝箱。问题是,它将它们全部放在同一个地方。随机不会为v3点生成唯一的随机数。但是,如果我调试并逐步执行该方法,它将完美运行。
void CreateTreasure()
{
for (int i = 0; i < 20; i++)
{
Random random = new Random();
Treasure t = new Treasure(new Vector3((float)random.Next(0, 600), 0, (float)random.Next(600)));
treasureList.Add(t);
}
}
并在抽奖中循环
foreach (Treasure t in treasureList)
{
DrawModel(treasure, Matrix.Identity * Matrix.CreateScale(0.02f) * Matrix.CreateTranslation(t.Position));
PositionOnMap(ref t.Position);
}
PositionOnMap只取位置并调整Y以使模型位于高度图上。有什么想法吗?
答案 0 :(得分:2)
在循环外部创建随机数并且仅使用next next,也可以使用随机种子作为初始化程序,如:
var random = new Random(Guid.NewGuid().GetHashCode());
答案 1 :(得分:2)
您需要在循环之外移动Random。现在,它每次都会创建一个新的Random实例。由于默认种子是基于时间的,如果这种情况很快发生,第一次调用Next()将始终返回相同的值。试试这个:
void CreateTreasure()
{
// Just move this outside, so each .Next call is on the same instance...
Random random = new Random();
for (int i = 0; i < 20; i++)
{
Treasure t = new Treasure(new Vector3((float)random.Next(0, 600), 0, (float)random.Next(600)));
treasureList.Add(t);
}
}