2012-05-07 39 views
2

给定一个整数范围R = [a,b](其中a> = 0且b < = 100),R中的偏差整数n和一些偏差b,我可以用什么公式将一个随机数发生器倾向n?偏差随机数发生器到偏差为b的某个整数n

因此,例如,如果我包含数字1到10并且没有指定偏差数,那么理论上我应该有随机抽取其中一个数的平等机会。

但是,如果我确实给出了一个特定的偏差数(比如3),那么数字生成器应该比其他数字更频繁地绘制3个数字。

如果我超过6个频繁指定到10

除了偏置号码,然后数发生器应该从1到5来绘制说2的偏差可以使用哪些算法来实现这个?

我使用Ruby,如果它使任何更容易/更难。

+0

你的R有多大? –

+0

很小。不大于100. – MxyL

+0

抱歉,错误的答案;错过了这是一个整数。你只是想要一些“任意”的转换,还是必须有明确的属性(如mean和sd等于足够大的样本给出的那些)? –

回答

3

我认为最简单的路线是从你想要的特性正常(又名高斯)分布采样,然后转换结果:

  • 产生与给定的平均正常价值和SD
  • 舍入到最近的整数
  • 如果外部给定的范围(正常可以生成在从负无穷大到-infinity的整个范围值),丢弃和重复

如果您需要从统一生成法线,则最简单的变换是“box-muller”。

有一些细节您可能需要担心。特别是盒子磨具的范围有限(它不会产生极不可能的值)。所以如果你给出一个非常窄的范围,那么你将永远得不到全部的值。其他转换不是有限的 - 我会建议使用任何红宝石提供(寻找“正常”或“高斯”)。

另外,要小心回合的值。例如,2.6至3.4应全部变为3。如果你只是舍弃小数(所以3.0到3.999变成3),你会有偏见。

如果你真的关心效率,不想丢弃价值,你可以简单地发明一些东西。一种欺骗的方式是将均匀的变量与偏差值混合(因此9/10次产生统一的1/10次返回3)。在某些情况下,您只关心样本的平均值,这可能就足够了。

+0

对于第一种方法,这意味着如果我给意味着= 2和sd = 3,这有效地消除了像8被选择的数字正确吗?也许我可以生成另一个随机数来选择是否丢弃? – MxyL

+0

不,你会得到8.这就是(8-2)/ 3 = 2秒远离平均值,所以没有问题;它不会很常见。在理论上正常的发行版会变成无限的(实际上,盒子研磨器不匹配,但红宝石可能有一个正常/高斯随机发生器,效果更好)。请参阅编辑。 –

+0

我使用'rnd = [1,1,1,2] .sample'获得2的1/4机会。 – Kris

0

在第一部分“但是,如果我做给一个特定的偏置数(比如说,3),然后数发生器应绘制3比其他的数字越来越频繁。”,一个很简单的解决办法:

def randBias(a,b,biasedNum=None, bias=0): 
    x = random.randint(a, b+bias) 
    if x<= b: 
     return x 
    else: 
     return biasedNum 

对于第二部分,我会说这取决于任务。在需要从同一分布生成十亿个随机数的情况下,我会明确计算数字的概率并使用加权随机数生成器(请参阅Random weighted choice

0

如果您想要单峰分布(其中偏差只是集中在你的数字范围的一个特定值上,例如,当你指出3)时,那么由安德鲁·库克提供的答案很好---主要是因为它允许你非常准确地微调偏差。

如果你想要做出一些偏差 - 例如你想要一个三重分布,数字a,(a + b)/ 2和b比其他人更频繁,那么你会很好地执行加权随机选择。

的简单算法为这个在a recent question on StackOverflow给出;它的复杂性是线性的。使用这样的算法,则只需保持的列表,初始含{A,A + 1,A + 2,...,B-1,B}(因此尺寸B-A的+ 1),并且当要为X增加一个偏见,你会将X的几个副本列入清单---取决于你想要偏向多少。然后你从列表中选择一个随机项目。

如果你想要的东西更有效,最快捷的方法被称为这是implemented very clearly in Python by Denis Bzowy“别名法”;一旦你的阵列已经预处理,它在固定时间运行(但是这意味着,一旦你做预处理,你不能再更新偏见---或者你会重新处理表)。

缺点与这两种技术是,不像与高斯分布,朝偏压X,不会偏压也有所朝X-1和X + 1。要模拟这种效果,你将不得不做一些事情,如

def addBias(x, L): 
    L = concatList(L, [x, x, x, x, x]) 
    L = concatList(L, [x+2]) 
    L = concatList(L, [x+1, x+1]) 
    L = concatList(L, [x-1,x-1,x-1]) 
    L = concatList(L, [x-2])