我正在尝试创建一个程序性洞穴生成器,到目前为止,我有生成完全随机地图的代码:
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");
}
}
}
我想要获得的图像是这样的,除了黑色和白色:
我得到的是这个:
我相信这是因为我正在使用的随机数生成器(即Random().NextDouble()
)
谁知道更好的RNG?
答案 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;
}
...
}