2011-03-18 139 views
0

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

谢谢。

+0

我发现了一些实现和设计概念http://stackoverflow.com/search?q=non-uniform+random+numbers+generator这是最好的:http://stackoverflow.com/questions/1534285 /非均匀随机数生成器实现。他们都没有说任何语言是否已经支持非统一的随机数发生器。 – applefreak 2011-03-18 13:45:13

+0

C#根本不支持随机数生成,它是提供它的BCL。要回答你的问题,我们需要知道你希望它是不是统一的方式;钟形曲线还是别的什么? – 2011-03-18 14:01:10

+0

谢谢工作。什么是BCL?我使用了C#随机数生成器,但它始终是统一的。如果我在1-100之间生成了数百万的数字,那么每个数字的单个计数几乎相同。我希望选择是完全不一致的,所以可能有些数字根本没有被采集,有些数字计数器可能远远超过其他数字。我的意思是在选择下一个号码时不应该有任何优先权或依赖性。 – applefreak 2011-03-18 15:09:34

回答

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! 

     } 
+0

你能举个例子吗? – Eddie 2011-09-20 15:12:07

+0

编辑答案! – applefreak 2011-09-23 09:34:02

1

嗯,这是2016年,这个问题没有点,已经有一个公认的答案。但是,既然它出现在第二次,我搜索了“c#随机非统一”,我会继续并给我的方法。

开始之前,你必须考虑你想要什么样的非均匀分布。就我而言,我需要大部分数字都很低,而有些数字应该很高。对于任何分布,我们只需要考虑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的回答“那不可能完成”是适当的。使用计算机外部的源可以消除对时钟的依赖,但它仍然不会是真正的随机。你可能会认为没有什么是真的,但这是一个哲学问题。