随机函数从间隔返回数

时间:2012-02-21 20:43:26

标签: algorithm math random statistics probability

如何实现从区间1..1000返回随机数的函数 如果有一个数字N确定达到更高数字或更低数字的机会?

它应该表现如下: e.g。

  • 如果N = 0并且我们将产生许多倍的随机数,我们将得到一定的平衡(区间1..1000中的每个数字都有相同的机会)。
  • 如果N = 2321(我称之为正因子)将很难实现小数目(通常将生成数字> 900,有时数字接近500且很少数字<100)。最高的正数因素是高数字的最高概率
  • 如果N = -2321(负因子),这将与正因子
  • 相反

很明显,生成的数字将为给定的N特定曲线创建。您能告诉我如何实现这一目标以及我可以创建哪些曲线?我有什么可能吗?你如何限制正面和负面因素等。

谢谢你的帮助

3 个答案:

答案 0 :(得分:5)

如果您生成一个统一的随机数,然后将其提升到一个幂

因此,您可以在生成随机数时使用指数来选择幂。

def biased_random(scale, bias):
  return random.random() ** bias * scale

sum(biased_random(1000, 2.5) for x in range(100)) / 100
  291.59652962214676  # average less than 500

max(biased_random(1000, 2.5) for x in range(100))
  963.81166161355998  # but still occasionally generates large numbers

sum(biased_random(1000, .3) for x in range(100)) / 100
  813.90199860117821   # average > 500

min(biased_random(1000, .3) for x in range(100))
  265.25040459294883   # but still occasionally generates small numbers

答案 1 :(得分:2)

这个问题严重不足。如上所述,有一百万种方法可以解决它。

而不是任意的正面和负面的价值,试着想一想它们背后的含义是什么。恕我直言,beta发布是你应该考虑的。通过选择参数\ alpha和\ beta,您应该适当调整您的发布行为。

了解使用某些\ alpha和\ beta http://en.wikipedia.org/wiki/Beta_distribution#Shapes

可以获得哪些形状

http://en.wikipedia.org/wiki/File:Beta_distribution_pdf.svg

答案 2 :(得分:1)

让我们开始决定从[0,1]中选择数字,因为它会使事情更简单 n是表示分布(0,2321或-2321)的数字,如示例
中所示 我们只需要针对n&gt;的解决方案。 0,因为如果n&lt; 0.您可以取n的正数并从1中减去。

区间[0,1]中PDF的一个简单想法是x ^ n。 (或至少这种形状)
然后计算CDF是积分x ^ n并且是x ^(n + 1)/(n + 1)
因为CDF最后必须为1(在我们的例子中为1),我们的最终CDF大于x ^(n + 1)且适当加权 为了从中生成这种分布,我们必须计算quantile function

分位数函数与CDF相反,在我们的例子中。的x ^(1 /(N + 1))

就是这样。你的QF是x ^(1 /(n + 1))

要从[0,1]生成数字,您必须从[0,1](编程语言中最常见的随机函数)中随机选择均匀分布。 然后给这个白色(1 /(n + 1))

供电

我看到的唯一问题是正确计算1-x ^(1 /( - n + 1))可能是个问题,其中n <1。 0但我认为你可以使用log1p, 如果n <0

,它变为exp(log1p(-x ^(1 /( - n + 1)))

结论whit规范化

  if n>=0:  (x^(1/(n/1000+1)))*1000
  if n<0:   exp(log1p(-(x^(1/(-(n/1000)+1)))))*1000   
  where x is uniformly distributed random value in interval  [0,1]