回答
我能够根据我的要求使用均匀分布创建半非均匀分布。基本上,我从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!
}
你能举个例子吗? – Eddie 2011-09-20 15:12:07
编辑答案! – applefreak 2011-09-23 09:34:02
嗯,这是2016年,这个问题没有点,已经有一个公认的答案。但是,既然它出现在第二次,我搜索了“c#随机非统一”,我会继续并给我的方法。
开始之前,你必须考虑你想要什么样的非均匀分布。就我而言,我需要大部分数字都很低,而有些数字应该很高。对于任何分布,我们只需要考虑0到1之间的数字(因此在该范围之外的属性是不相关的)。结果可以相乘或以其他方式处理以适应任何期望的范围。最后,(x-1)^ 4为我工作。当x = 0时,它的值为1,当x = 1时值为0,但平均更可能低于高。
在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. 非均匀随机发生器
- 2. Omnet ++均匀随机数生成
- 3. 均匀分布的随机数生成
- 4. 生成一个非均匀分布的随机数
- 5. 非均匀分布的随机数组
- 6. 产生不均匀的伪随机数
- 7. 生成500行随机数,30行,均匀分布
- 8. 从均匀分布生成随机数的最快方法python
- 9. 生成均匀分布的伪随机数在C++
- 10. 在CUDA设备上生成均匀的双随机数
- 11. 制作CURAND从均匀分布生成不同的随机数
- 12. <random>随机数发生器和均匀分布
- 13. 随机均匀分布
- 14. 随机均匀分布
- 15. 生成均匀分布的随机排列的算法
- 16. 用于生成均匀分布的随机位集的方法
- 17. 生成一个边缘均匀分布的随机图
- 18. 如何生成均匀分布的随机DFA?
- 19. 在矩形内(均匀地)生成随机点?
- 20. 生成均匀随机变量时下限为接近零
- 21. 在给定范围内生成均匀随机偏差
- 22. 生成的环(环)内的均匀随机点
- 23. 随机数,具有不均匀分布
- 24. 使随机数均匀在C++
- 25. 均匀分布的随机数
- 26. 非均匀(趋向值偏差)随机数在JavaScript
- 27. Java使用Possion/Gaussian /指数/几何/均匀分布生成随机数
- 28. 在分布式环境中生成均匀分布的随机数
- 29. 在C++的特定范围内生成随机均匀可分的数字?
- 30. 随机数生成器帮助不生成随机数 - C
我发现了一些实现和设计概念http://stackoverflow.com/search?q=non-uniform+random+numbers+generator这是最好的:http://stackoverflow.com/questions/1534285 /非均匀随机数生成器实现。他们都没有说任何语言是否已经支持非统一的随机数发生器。 – applefreak 2011-03-18 13:45:13
C#根本不支持随机数生成,它是提供它的BCL。要回答你的问题,我们需要知道你希望它是不是统一的方式;钟形曲线还是别的什么? – 2011-03-18 14:01:10
谢谢工作。什么是BCL?我使用了C#随机数生成器,但它始终是统一的。如果我在1-100之间生成了数百万的数字,那么每个数字的单个计数几乎相同。我希望选择是完全不一致的,所以可能有些数字根本没有被采集,有些数字计数器可能远远超过其他数字。我的意思是在选择下一个号码时不应该有任何优先权或依赖性。 – applefreak 2011-03-18 15:09:34