【问题标题】:Lack of Randomness in Map Generator地图生成器缺乏随机性
【发布时间】:2014-02-20 13:00:06
【问题描述】:

我正在尝试生成随机数 0-49。只要随机数不为 0,我就想在网格中绘制链接。每次我得到一个 0 时,后面跟着另外十个 0(给或取)。在我的研究中,他们说如果我继续创建我的 Random 的新实例,这将是问题,但我没有这样做。我的代码如下:

//Class begins
    namespace Mascape
    {
        public class Game1 : Game
        {
            GraphicsDeviceManager graphics;
            SpriteBatch spriteBatch;
            Wall[, ,] walls = new Wall[2, 15, 10];
            int mapWidth=15;
            int mapHeight=10;
            Random rand = new Random();  //Outside of any methods or loops.
            int mapFullness;

//下面是我的Initialize()方法中

//i is horizontal vs. vertical link
//j is the x position of the link
//k is the y position of the link


        mapFullness = 50;
        for (int i = 0; i < 2; ++i)
        {
            for (int j = 0; j < mapWidth; ++j)
            {
                for (int k = 0; k < mapHeight; ++k)
                {
                    if (!(rand.Next(50) == 0))
                    {
                        walls[i, j, k].active = true; //Links are drawn if active
                    }
                }
            }

        }

我正在尝试绘制一个带有随机缺失链接的网格。目标是让它们散开,出现大约 50 分之一。这是实际结果:

知道为什么缺少随机性吗?如果您想了解更多信息,请告诉我。

【问题讨论】:

  • 为什么投反对票?我以为我在这个问题上很清楚。我也做过研究。请让我知道,以免我重蹈覆辙。
  • 减法随机数生成器算法用于生成随机数。因此,即使可以预测使用相同种子生成的下一个数字,您的数字也会均匀分布。嗯,我可以想为什么每次你得到一个 0,后面跟着另一个 0。紧邻创建的 System.Random 实例会产生相同的随机数序列,因此请注意我们在循环中创建的实例。但是我在您发布的代码中没有看到任何实例创建循环。这是多线程的吗?
  • @GeorgePhilip 我没有对线程做任何事情,但我使用的是 MonoGame 模板 (OpenGL)
  • 这个问题不需要反对。
  • Random 绝对正确地完成了它的工作。如果我是你,我会测试代码的其他部分以确保它们也能正常工作。也许制作一个预定义的数字 0-49 数组,例如 int[] predefArray = new int[50] { 0, 1, 2, ... , 49 },然后从该数组中获取值,而不是调用 Random。比如for (int k = 0; k &lt; mapHeight; ++k) if (predefArray[k] != 0) walls[i, j, k].active = true;。之后,检查你的图片,确保只有 k 为 0 的部分是你没有墙的地方。

标签: c# random grid graphics2d


【解决方案1】:

应该还有更多。请参阅从您复制的以下代码按预期生成随机数。

        Random rand = new Random();
        int mapWidth = 5;
        int mapHeight = 10;

        for (int i = 0; i < 2; ++i)
        {
            for (int j = 0; j < mapWidth; ++j)
            {
                for (int k = 0; k < mapHeight; ++k)
                {
                    Console.WriteLine(rand.Next(50));
                }
            }

        }

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-12-06
    • 2013-01-18
    • 1970-01-01
    • 1970-01-01
    • 2016-12-30
    相关资源
    最近更新 更多