如何在C#中获取可控的随机数

3
我希望生成可控的随机数,这意味着数字应该近似等间隔,并分布在范围内。
例如,如果边界为1和50,则如果第一个生成的数字是40,则下一个数字不应该靠近。假设它是20,那么30将是一个可接受的第三个数字。
请帮忙。

3
为了获取代码,你需要定义一些规则。你的问题并没有这样做。如果你说明你将如何使用这些数字,可能会有帮助。 - David Heffernan
2
如果它有可预测的模式,那么它怎么可能是随机的呢? - jball
你事先知道要生成多少个数字吗? - wnoise
实际上,我已经上传了一个文件,并希望在随机时间发布它,例如如果我选择在5-10分钟之间发布它,则有可能在8-10分钟之间发布5条记录。 - vakas
2
这个注释使得需求不够清晰。 - David Heffernan
3个回答

5
与完全随机的数字不同,您可能希望查看噪声函数(例如Perlin Noise)以可预测的方式生成表面上随机的数据。

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

这里有几种变体 - 如果你能通过算法描述你的数据分割,那么值得研究。

在游戏中,它被广泛用于平滑和增加对随机生成地形纹理的兴趣。

这里有一些C#的示例实现,其中一个用于生成位图,但很容易适应填充2D数组:

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

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

https://stackoverflow.com/search?q=perlin+noise


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

因为您不允许在中心设置点。

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

这是我最初理解问题的方式。但这不是 OP 需要的。 - CodesInChaos
@CodeInChaos我们并不清楚原帖的作者需要随机数做什么用途,如果只是简单需求,使用柏林噪声可能过于复杂。 - Ozan
2
不要在每次调用时创建新的随机数生成器!这会导致它基于当前时间重新启动种子... - TDaver
已修复,谢谢。当你想要简洁时容易犯错。 - Ozan
Perlin噪声并不是那么难以实现 - 以C#实现为例 - 大约30行,但我同意OP需要帮助我们理解他对数据的使用,他最后的评论与他最初的问题有所不同。 - stephbu

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接