如何实现从区间1..1000返回随机数的函数 如果有一个数字N确定达到更高数字或更低数字的机会?
它应该表现如下: e.g。
很明显,生成的数字将为给定的N特定曲线创建。您能告诉我如何实现这一目标以及我可以创建哪些曲线?我有什么可能吗?你如何限制正面和负面因素等。
谢谢你的帮助
答案 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
可以获得哪些形状答案 2 :(得分:1)
让我们开始决定从[0,1]中选择数字,因为它会使事情更简单
n是表示分布(0,2321或-2321)的数字,如示例
中所示
我们只需要针对n>的解决方案。 0,因为如果n< 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]