C# 如何实现非随机的随机数生成器?

C# 如何实现非随机的随机数生成器?,c#,.net,algorithm,random,C#,.net,Algorithm,Random,我需要一个随机数生成器,它可以生成n和m之间的各种数字,但不以相同的概率生成。我想在n和m之间设置一个值x,其中可能性最大: 使用Random类是否有一种简单的方法来实现这一点?可能性应具有二项分布或类似形式(精确的二项分布并不重要,粗略近似也可以) 编辑 也许我必须澄清:我不是在寻找二项式或高斯分布,而是在寻找类似这样的东西: 我想定义最大可能性的值x 编辑 不幸的是,我之前所接受的答案是我所怀疑的。所以我还在寻找答案 您可以使用转换从0和1之间均匀分布的数字序列生成伪随机正态分布数字序列

我需要一个随机数生成器,它可以生成n和m之间的各种数字,但不以相同的概率生成。我想在n和m之间设置一个值x,其中可能性最大:

使用Random类是否有一种简单的方法来实现这一点?可能性应具有二项分布或类似形式(精确的二项分布并不重要,粗略近似也可以)

编辑 也许我必须澄清:我不是在寻找二项式或高斯分布,而是在寻找类似这样的东西:

我想定义最大可能性的值x

编辑 不幸的是,我之前所接受的答案是我所怀疑的。所以我还在寻找答案

您可以使用转换从0和1之间均匀分布的数字序列生成伪随机正态分布数字序列


您需要一台发电机在“正态分布”下工作。请看这里:
Java SDK具有良好的实现Random.nextGaussian(取自())

我希望它相当清楚如何从java源代码解析到c#

更新:我如何改变中位数:

public static float gaussianInRange(float from, float mean, float to)
{
    if( !(from < mean && mean < to) )
        throw new IllegalArgumentException(MessageFormat.format("RandomRange.gaussianInRange({0}, {1}, {2})", from, mean, to));

    int p = _staticRndGen.nextInt(100);
    float retval;
    if (p < (mean*Math.abs(from - to)))
    {
        double interval1 = (_staticRndGen.nextGaussian() * (mean - from));
        retval = from + (float) (interval1);
    }
    else
    {
        double interval2 = (_staticRndGen.nextGaussian() * (to - mean));
        retval = mean + (float) (interval2);
    }
    while (retval < from || retval > to)
    {
        if (retval < from)
            retval = (from - retval) + from;
        if (retval > to)
            retval = to - (retval - to);
    }
    return retval;
}
public static float gaussianInRange(float from,float mean,float to)
{
if(!(从to)
{
if(retval到)
retval=to-(retval-to);
}
返回返回;
}
smth相对简单。 您可以生成2个随机数: 第一个定义第二个随机数与x的接近程度


你可以使用任何你喜欢的断点/函数级别。

看看这是否有帮助:可能重复的
double random(){return 17;}
-只响应你的主题。这个
(17,17,17,…)
实际上被称为
“希伯来大学随机序列”
。胡吉的每一位老师每周至少说一次“让我们取任何数字。说……17”:)是的,那就很清楚了。但我现在如何设置我的值的最大可能性?@Roflcoptr-nextGaussian的每个SDK返回值是一个0.0左右的值,偏差为1.0(因此结果在范围(-1;1))。所以只要加上+2就可以得到范围(1..3)内的值@Dewfy:是的,我理解这一点,但是最大的可能性分别是0和1.5。但是如果最高的可能性应该接近3怎么办?@Roflcoptr-事实上,我也有同样的问题-移动相对中位数,所以看看我的更新答案。@Dewfy非常感谢,这正是我要寻找的全部方法!请注意,此方法生成两个高斯分布数,从到均匀分布数。因此,很容易将其速度提高一倍左右,而只需在发布时生成一个。
public static float gaussianInRange(float from, float mean, float to)
{
    if( !(from < mean && mean < to) )
        throw new IllegalArgumentException(MessageFormat.format("RandomRange.gaussianInRange({0}, {1}, {2})", from, mean, to));

    int p = _staticRndGen.nextInt(100);
    float retval;
    if (p < (mean*Math.abs(from - to)))
    {
        double interval1 = (_staticRndGen.nextGaussian() * (mean - from));
        retval = from + (float) (interval1);
    }
    else
    {
        double interval2 = (_staticRndGen.nextGaussian() * (to - mean));
        retval = mean + (float) (interval2);
    }
    while (retval < from || retval > to)
    {
        if (retval < from)
            retval = (from - retval) + from;
        if (retval > to)
            retval = to - (retval - to);
    }
    return retval;
}