2013-04-01 174 views
2

假设我有一个范围从1到10的值。我想根据某种高斯概率从这个范围中随机选择一个数字。所以,有更大的机会获得约4,5,6的值。仍有机会获得1和10,但机会较小。它不需要严格遵循高斯分布,因为1和10的值几乎几乎不可能得到。我希望至少改变并歪曲获得极端值的机会,同时扩大获得其他价值的机会。通过倾斜,我的意思是可能有些时候我会希望得到10的机会超过1.因此,分布可能不一定是对称的。根据概率从一系列值中随机挑选一个数字

我尝试使用随机类播种随机浮点值并将值乘以10,但可能仍然是线性的。我想不出如何做到这一点。有没有简单的方法来实现这一点?

+0

这可能是相关的:http://stackoverflow.com/questions/218060/random-gaussian-variables –

+0

“C#高斯随机”的第一个谷歌结果给了:[随机高斯变量](http:// stackoverflow。 COM /问题/ 218060 /随机高斯变量)。你尝试过吗? – publicgk

回答

2

在C#中,来自Random的值具有均匀分布,因此将它们乘以某个常数就会简单地改变值的范围。

但是,使用Box-Muller变换,您可以使用两个均匀的随机变量创建高斯分布。

查看this question的实现答案。

+0

也许我应该让自己的问题更清楚。我并不是真的在寻找一个精确的高斯分布。高斯分布是对称的。我希望我可以让分配有时偏向一边或另一边。 – Carven

+0

@Carven这当然是可能的。您需要确定您想要的内容以及如何创建一个算法,以基于一定数量的均匀分布的输入值生成此类分布。确切的实施将取决于您想要的分销细节。 – Servy

1

这可能帮助你:

应用您的概率函数值1到10然后你得到它们的频率。现在创建一个数组,每个数值从1到10,每个数值根据其频率重复。 e.g:

int[] values = { 1, 2, 2, 3, 3, 3, 4, 4, 4, 4, 5, 5, 5, 5, 5, 6, 6, 6, 6, 6, 7, 7, 7, 7, 8, 8, 8, 9, 10 }; 

现在你可以使用一个变量Random 0和values.Length之间得到一个数(指数)。最后返回值[index]。

+1

预先计算这样的查找对于分布函数是非常有效的,当它们应用于的范围既是静态的又是小的时候,分布函数并不复杂。如果任何这些断言不适用(我怀疑他们都这样做),那么这不是一个实际的解决方案。 – Servy