我想生成随机数但受控制,这意味着数字应该几乎相等,并在范围内传播。
例如,如果边界是1和50,那么如果第一个生成的数字是40,则下一个数字不应该接近。假设它是20,那么30将是可接受的第三个数字。
请帮忙。
答案 0 :(得分:5)
您可能希望查看像Perlin Noise这样的噪声函数,以可预测的方式生成表面随机数据,而不是完全随机的数字。
有一些变化 - 如果你能用算法描述你的数据分割,绝对值得研究。
它在游戏中经常用于平滑并增加对随机生成的地形纹理的兴趣。
在C#中有一些示例实现,这个实现用于生成位图,但可以很容易地适应填充二维数组:
这里也有很多关于Perlin Noise的问题:
答案 1 :(得分:3)
您可以这样做:
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
因为你不允许在中心点。
答案 2 :(得分:0)
定义新数字应与最后一个相距的间隔距离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);
}