还是带概率的随机函数,这次是双精度数

2014-11-03 15:44:51 +08:00
 lehui99
设此函数为[0,1)区间内的平均概率分布随机函数:
double random();
现在要求利用此函数实现一个[0,1)区间内的非均匀分布随机函数,分布的概率符线性增长函数f(x) = x。即:
1、落在[0,0.5)区间内的概率是落在[0.5,1)区间内概率的四分之一;
2、落在[0,0.25)区间内的概率是落在[0.25,0.5)区间内概率的四分之一;
3、落在[0.5,0.75)区间内的概率是落在[0.75,1)区间内概率的四分之一;
4、落在[0,0.125)区间内的概率是落在[0.125,0.25)区间内概率的四分之一;
5、以此类推……;
说再明白一点:
1、如果将[0,1)从0.5处分成2段,那么落在[0,0.5)区间内的概率是四分之一,落在[0.5,1)区间内的概率是四分之三;
2、如果将[0,1)从0.25,0.5,0.75处分成4段,那么落在[0,0.25)区间内的概率是十六分之一,落在[0.25,0.5)区间内的概率是十六分之三,落在[0.5,0.75)区间内的概率是十六分之五,落在[0.75,1)区间内的概率是十六分之七;
3、如果将[0,1)平均分成8段,那么落在[0,0.125)区间内的概率是六十四分之一,落在[0.125,0.25)区间内的概率是六十四分之三,落在[0.25,0.375)区间内的概率是六十四分之五,……;
4、以此类推……;
如何实现这个函数?
3029 次点击
所在节点    程序员
10 条回复
lehui99
2014-11-03 15:51:28 +08:00
第一个1 - 5有误,大家看最后的1 - 4条即可。
cmy5001
2014-11-03 16:18:08 +08:00
x = random();
y = x*x;
return y;
wy315700
2014-11-03 16:26:47 +08:00
@cmy5001 这样弄出来的概率是 P(x in [0,k]) = sqrt(k)
cmy5001
2014-11-03 16:41:20 +08:00
sorry,应该是:
return sqrt(random());
hahastudio
2014-11-03 16:57:54 +08:00
http://blog.pluskid.org/?p=430
涉及到概率密度函数的就得推导了= =
wy315700
2014-11-03 17:18:50 +08:00
@cmy5001
@lehui99

想了一下,LZ要求的是连续变量的概率分布问题,如果不计算计算机在实数上的近似的话。

连续变量y满足概率分布 P(y in [0,k]) = k * k

随机的x = random()则满足概率分布 P(x in [0,k]) = k

一般的,已知
P(x in [0,k]) = k
P(y in [0,k]) = f(k)

求如何用x生成y

令y = g(x) 则,x = g-1(k) (反函数或逆函数)
前提是g是一个一一映射的函数

P(x in [0,k]) = k

P(g(x) in [0,g(k)]) = k
将这个函数看成关于k的函数,则

P(g(x) in [0,k]) = g-1(k)

也就是
P(y in [0,k]) = g-1(k)

g-1(k) = f(k)

也就是g是f的反函数

x * x的反函数是sqrt(x)

证毕

没有函数编辑器,看起来不是很方便啊。
lehui99
2014-11-03 18:00:17 +08:00
@wy315700 有道理!!赞!
wisatbff
2014-11-03 18:52:03 +08:00
每一段内要均匀分布还是?
kamushin
2014-11-03 19:47:32 +08:00
@wy315700 这里说的不错。但是我想指出一些可能让人不理解的地方。因为原文总是以概率分布这个词来概括PDF(概率分布函数)和CDF(累积分布函数)。
原理应该是这样的:
FX(x)是概率分布X的累积分布函数,假设FX(x)是增函数,那么存在反函数FX-1。若a是[0,1]区间上均匀分布的随机变量,那么FX-1(a)服从X分布。
semicircle21
2014-11-03 20:34:23 +08:00
我不确定我理解了楼主的问题, 但我之前模拟正态分布随机时, 这样做过: (大概是个土法子, 但运行效果还行)
比如: 在 [0, N] 之间, 则取 M 次 随机数的平均数, M越大, 结果越集中.
如果要把概率集中点调到 0, 减 N/2 再取绝对值应该可以.

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/143638

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX