如何在c#中获得受控随机数

时间:2011-02-06 08:26:31

标签: c# random

我想生成随机数但受控制,这意味着数字应该几乎相等,并在范围内传播。

例如,如果边界是1和50,那么如果第一个生成的数字是40,则下一个数字不应该接近。假设它是20,那么30将是可接受的第三个数字。

请帮忙。

3 个答案:

答案 0 :(得分:5)

您可能希望查看像Perlin Noise这样的噪声函数,以可预测的方式生成表面随机数据,而不是完全随机的数字。

  

http://en.wikipedia.org/wiki/Perlin_noise

有一些变化 - 如果你能用算法描述你的数据分割,绝对值得研究。

它在游戏中经常用于平滑并增加对随机生成的地形纹理的兴趣。

在C#中有一些示例实现,这个实现用于生成位图,但可以很容易地适应填充二维数组:

  

http://www.gutgames.com/post/Perlin-Noise.aspx

这里也有很多关于Perlin Noise的问题:

  

https://stackoverflow.com/search?q=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}]]  

enter image description here

您可能会看到频率在边框中累积

此外,如果你不谨慎,并要求距离太高,结果将是这样的:

For[i = 1, i < 50000, i++, 
  AppendTo[rnd, randomSpaced[{0, 40}, 25, Last[rnd]]];];
   Histogram[rnd

enter image description here

因为你不允许在中心点。

答案 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);
}