C# 奇抽行为

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

在我的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);
        }
    }

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
实例并在整个游戏中使用。