我希望生成可控的随机数,这意味着数字应该近似等间隔,并分布在范围内。
例如,如果边界为1和50,则如果第一个生成的数字是40,则下一个数字不应该靠近。假设它是20,那么30将是一个可接受的第三个数字。
请帮忙。
例如,如果边界为1和50,则如果第一个生成的数字是40,则下一个数字不应该靠近。假设它是20,那么30将是一个可接受的第三个数字。
请帮忙。
这里有几种变体 - 如果你能通过算法描述你的数据分割,那么值得研究。
在游戏中,它被广泛用于平滑和增加对随机生成地形纹理的兴趣。
这里有一些C#的示例实现,其中一个用于生成位图,但很容易适应填充2D数组:
这里也有很多关于Perlin噪声的问题:
randomSpaced[interval_, mindistance_, lastone_] :=
(While[Abs[(new = RandomReal[interval])-lastone] < mindistance,];
Return[new];)
For[i = 1, i < 500000, i++,
rnd[i] = randomSpaced[{0, 40}, 10, rnd[i - 1]];
];
Histogram[Table[rnd[i], {i, 500000}]]
你可能会发现频率累积在边缘处
此外,如果你不小心地请求太高的距离,结果会像这样:
For[i = 1, i < 50000, i++,
AppendTo[rnd, randomSpaced[{0, 40}, 25, Last[rnd]]];];
Histogram[rnd
定义一个分离距离d,新数字应该与上一个数字相隔多远。如果上一个数字是20,那么下一个随机数不应该从20-d到20+d之间。这意味着随机间隔应为[1,20-d)和(20+d,50]。
由于您不能使用两个间隔调用random.next(),因此需要使用减少2d的间隔调用它,然后将随机数映射到原始的[1,50]间隔。
static class RandomExcludingSurrounding
{
static Random random = new Random();
public static int Next(int x, int d, int min, int max)
{
int next = random.Next(min, max-2*d);
if (next > x-d)
next += 2*d;
return next;
}
}
int min = 1;
int max = 50;
Random random = new Random();
int next = random.Next(min, max);
while(true)
{
int next = RandomExcludingSurrounding.Next(next, 20, min, max);
Console.WriteLine(next);
}