非均匀随机数发生器

时间:2011-03-18 13:41:49

标签: random

我不确定是否有任何语言(最好是C#.NET)支持非均匀随机数生成器。有没有?我想知道什么是实现我们自己的非均匀随机数发生器的最佳设计方法?

感谢。

2 个答案:

答案 0 :(得分:2)

嗯,这是2016年,这个问题没有分,已经有了一个接受的答案。但是从那以后,当我搜索“c#random non uniform”时,它排在第二位,我会继续前进并给出我的方法。

在开始之前,您必须考虑所需的非均匀分布。在我的情况下,我需要大多数数字较低,而少数应该很高。对于任何分布,我们只需要考虑0到1之间的数字(因此该范围之外的属性是无关紧要的)。结果可以乘以或以其他方式操纵以适合任何期望的范围。最后,(x-1)^ 4为我工作。当x = 0时它的值为1,当x = 1时它的值为0,但平均更可能低于高。

(x-1)^4

在C#中,Random类的生成器只生成整数。所以第一步是转换它,使它产生0到1之间的有理数。

var rnd = new Random();
var x = (double)rnd.Next(0,10000) / 10000;

然后,只需将随机数插入所需的分发中即可。

x = Math.Pow(x-1,4);

我用这种方法创建了一个随机生成的数字列表,得到了以下结果(排序和舍入):

0
0.0001
0.0109
0.0115
0.042
0.1615
0.3077
0.5713
0.7217
0.8087

正如您所看到的,分布不均匀:它偏向0,但仍然可以将0或1作为值。

由于在SO上搜索答案时的含义,我正在回答问题。但在@ applefreak对他自己的问题的评论中,他似乎也可能正在寻找一个真正的非伪随机数发生器。 @ JonHanna的回答“那不可能完成”是恰当的。使用计算机外部的源可以消除对时钟的依赖,但它仍然不会真正随机。你可以说没有真正的东西,但这是一个哲学问题。

答案 1 :(得分:1)

我能够根据我的要求使用均匀分布创建半非均匀分布。基本上我从1到N范围生成所需的M数,然后再生成(N-M)个数并扔掉它们。就像这样,当我生成下一组数字时,我得到的概率几乎相等于1到N之间的所有数字。它对我有用!

C#中的示例代码:

        int low=1, high=50;
        Random random = new Random();
        int total = 50;
        ArrayList set_nos = new ArrayList();

        while (--total > 0)
        {
            int set = 6;
            int loop = 0;
            while (--set > 0)
            {
                int temp = random.Next(low, high);
                loop++;
                if (set_nos.Contains(temp))
                    continue;

                set_nos.Add(temp);
            }

            for (int unused = 1; unused < high-loop; unused++)
                random.Next(low, high);

            //Use set_nos for your purpose!

        }