C# 奇抽行为
在我的xna游戏中,我有一种在地图上随机位置创建宝箱的方法。问题是,它把它们都吸引到同一个地方。随机数不会为v3点生成唯一的随机数。但是,如果我调试并逐步完成该方法,它将非常有效C# 奇抽行为,c#,xna,xna-4.0,C#,Xna,Xna 4.0,在我的xna游戏中,我有一种在地图上随机位置创建宝箱的方法。问题是,它把它们都吸引到同一个地方。随机数不会为v3点生成唯一的随机数。但是,如果我调试并逐步完成该方法,它将非常有效 void CreateTreasure() { for (int i = 0; i < 20; i++) { Random random = new Random(); Treasure t = new Treasure(ne
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);
}
}
PositionMap只是获取位置并调整Y,使模型位于高度贴图上。有什么想法吗?在循环外部创建random,只在循环内部使用next,同时对初始值设定项使用random seed,如:
var random = new Random(Guid.NewGuid().GetHashCode());
在循环外部创建random,仅在内部使用next,同时对初始值设定项使用random seed,如:
var random = new Random(Guid.NewGuid().GetHashCode());
你需要在循环外随机移动。现在,它将每次创建一个新的随机实例。由于默认种子是基于时间的,如果这种情况很快发生,对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);
}
}
void CreateTreasure()
{
//把这个移到外面,这样每个下一个调用都在同一个实例上。。。
随机=新随机();
对于(int i=0;i<20;i++)
{
宝藏t=新宝藏(新矢量3((浮动)随机。下一个(0600),0,(浮动)随机。下一个(600));
增加(t);
}
}
您需要在循环外随机移动。现在,它将每次创建一个新的随机实例。由于默认种子是基于时间的,如果这种情况很快发生,对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);
}
}
void CreateTreasure()
{
//把这个移到外面,这样每个下一个调用都在同一个实例上。。。
随机=新随机();
对于(int i=0;i<20;i++)
{
宝藏t=新宝藏(新矢量3((浮动)随机。下一个(0600),0,(浮动)随机。下一个(600));
增加(t);
}
}
在循环中看到“新”总是需要警惕的。通常是因为内存问题。你绝对不应该像那样初始化Random
!除非您确实需要种子随机数生成器,否则请使用默认构造函数。将其植入GUID的散列中是一个糟糕的想法。您的论点缺乏任何支持性事实,请用建设性的推理进行详细说明,或撤回反对意见也许您愿意详细说明它存在的原因?在我看来,这似乎表明了极为糟糕的编码实践:好像你已经注意到,每毫秒创建多个随机
,会给你相同的序列,并且只是在不理解问题的情况下插入了一些东西来修复它,这就是:首先,你不应该创建这么多的Random
实例!(我知道你是一个“网络人”——如果你必须为每个请求实例一个RNG并至少在同一时刻避免冲突,我可能会看到一个这样的用例。但这将是一个非常具体的、有针对性的黑客行为,应该这样对待。)在循环中看到“新”总是需要警惕的。通常是因为内存问题。你绝对不应该像那样初始化Random
!除非您确实需要种子随机数生成器,否则请使用默认构造函数。将其植入GUID的散列中是一个糟糕的想法。您的论点缺乏任何支持性事实,请用建设性的推理进行详细说明,或撤回反对意见也许您愿意详细说明它存在的原因?在我看来,这似乎表明了极为糟糕的编码实践:好像你已经注意到,每毫秒创建多个随机
,会给你相同的序列,并且只是在不理解问题的情况下插入了一些东西来修复它,这就是:首先,你不应该创建这么多的Random
实例!(我知道你是一个“网络人”——如果你必须为每个请求实例一个RNG并避免冲突,至少在同一时刻,我可能会看到一个这样的用例。但这将是一个非常具体的、有针对性的黑客,应该这样对待。)或者更好-只需创建一个Random
实例并在整个游戏中使用。或者更好-只需创建一个Random
实例并在整个游戏中使用。