任何人都知道一个好的随机数发生器

时间:2018-05-27 19:19:33

标签: c# random

我正在尝试创建一个程序性洞穴生成器,到目前为止,我有生成完全随机地图的代码:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Drawing;

namespace CelularAutomata
{
    class Program
    {
        static int width=512, height=512;
        Boolean[,] cellmap = new Boolean[width, height];
        static float chanceToStartAlive = 0.45f;

        public static Boolean[,] initialiseMap()
        {
            Boolean[,] map = new Boolean[width, height];

            for (int x = 0; x < width; x++)
            {
                Random rng = new Random();
                for (int y = 0; y < height; y++)
                {
                    doube random = rng.NextDouble();
                    if (random < chanceToStartAlive)
                    {
                        map[x,y] = true;
                    }
                }
            }
            return map;
        }

        public static Bitmap createImage(Boolean[,] map)
        {
            Bitmap bmp = new Bitmap(512, 512);

            for (int y = 0; y < height; y++)
            {
                for (int x = 0; x < width; x++)
                {
                    if (map[x, y])
                    {
                        bmp.SetPixel(x, y, Color.FromArgb(255, 255, 255));
                    }
                    else 
                    {
                        bmp.SetPixel(x, y, Color.FromArgb(0, 0, 0));
                    }
                 }
                Console.Write('\n');
            }
            return bmp;
        }

        static void Main(string[] args)
        {
            Boolean[,] map = initialiseMap();
            Bitmap bmp = createImage(map);
            bmp.Save("C:\\Users\\radu\\Documents\\Sync\\Licenta\\chamber.png");
        }
    }
}

我想要获得的图像是这样的,除了黑色和白色:

desired image

我得到的是这个:

generated image

我相信这是因为我正在使用的随机数生成器(即Random().NextDouble()) 谁知道更好的RNG?

1 个答案:

答案 0 :(得分:2)

不是在for循环中使用Random rng = new Random();,而是在上面创建一个实例,并在每个循环中使用相同的实例。这是因为快速连续创建的多个Random实例将具有相同的种子,因此生成相同的伪随机数序列。

例如:

class Program
{
    Random rng = new Random();
    ...
    public static Boolean[,] initialiseMap()
    {
        Boolean[,] map = new Boolean[width, height];

        for (int x = 0; x < width; x++)
        {
            for (int y = 0; y < height; y++)
            {
                double random = rng.NextDouble();
                if (random < chanceToStartAlive)
                {
                    map[x,y] = true;
                }
            }
        }
        return map;
    }
    ...
}