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

C# 如何在c语言中获得受控随机数,c#,random,C#,Random,我想生成随机数,但要控制,这意味着这些数字应该几乎相等地分开,并在整个范围内传播 例如,如果边界为1和50,则如果第一个生成的数字为40,则下一个数字不应接近。假设是20,那么30是可以接受的第三个数字 请提供帮助。与完全随机数不同,您可能希望查看Perlin noise等噪波函数,以可预测的方式生成表面随机的数据 这里有一些变化——如果你能用算法描述你的数据分割,那么绝对值得研究 在游戏中经常使用它来平滑和增加对随机生成的地形纹理的兴趣 在C语言中有几个示例实现,这一个用于生成位图,但可以很容

我想生成随机数,但要控制,这意味着这些数字应该几乎相等地分开,并在整个范围内传播

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


请提供帮助。

与完全随机数不同,您可能希望查看Perlin noise等噪波函数,以可预测的方式生成表面随机的数据

这里有一些变化——如果你能用算法描述你的数据分割,那么绝对值得研究

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

在C语言中有几个示例实现,这一个用于生成位图,但可以很容易地调整以填充2d数组:

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


定义新编号与最后一个编号之间的间隔距离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);
}

您可以这样做:

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
]


因为您不允许点位于中心。

您必须定义一些规则才能获得代码。你的Q不这样做。如果你说明你将如何处理这些数字,这可能会有所帮助。如果有一个可预测的模式,它会是随机的吗?你提前知道你将生成多少个数字吗?事实上,我上传了一个文件,我想在随机时间发布它,就像我选择在5-10分钟之间发布一样。然后在8-10分钟之间发布5条记录。这一评论使要求不那么清晰,这就是最初理解问题的方式。但这不是OP所需要的。@CodeInChaos我们不知道OP需要随机数做什么,如果它是琐碎的话,进入柏林噪音是多余的。不要每次调用都使用新的随机数!它将在DateTime上重新启动种子库。现在每次…都已修复,谢谢。Perlin Noise的实现并没有那么复杂——看看C impl。例如-~30行,但我同意OP需要帮助我们理解他对数据的使用,他最后的评论是对他最初的Q的扭曲。