V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
lehui99
V2EX  ›  程序员

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

  •  
  •   lehui99 · 2014-11-03 15:44:51 +08:00 · 2996 次点击
    这是一个创建于 3469 天前的主题,其中的信息可能已经有所发展或是发生改变。
    设此函数为[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、以此类推……;
    如何实现这个函数?
    10 条回复    2014-11-03 20:34:23 +08:00
    lehui99
        1
    lehui99  
    OP
       2014-11-03 15:51:28 +08:00
    第一个1 - 5有误,大家看最后的1 - 4条即可。
    cmy5001
        2
    cmy5001  
       2014-11-03 16:18:08 +08:00
    x = random();
    y = x*x;
    return y;
    wy315700
        3
    wy315700  
       2014-11-03 16:26:47 +08:00
    @cmy5001 这样弄出来的概率是 P(x in [0,k]) = sqrt(k)
    cmy5001
        4
    cmy5001  
       2014-11-03 16:41:20 +08:00
    sorry,应该是:
    return sqrt(random());
    hahastudio
        5
    hahastudio  
       2014-11-03 16:57:54 +08:00
    http://blog.pluskid.org/?p=430
    涉及到概率密度函数的就得推导了= =
    wy315700
        6
    wy315700  
       2014-11-03 17:18:50 +08:00   ❤️ 1
    @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
        7
    lehui99  
    OP
       2014-11-03 18:00:17 +08:00
    @wy315700 有道理!!赞!
    wisatbff
        8
    wisatbff  
       2014-11-03 18:52:03 +08:00
    每一段内要均匀分布还是?
    kamushin
        9
    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
        10
    semicircle21  
       2014-11-03 20:34:23 +08:00
    我不确定我理解了楼主的问题, 但我之前模拟正态分布随机时, 这样做过: (大概是个土法子, 但运行效果还行)
    比如: 在 [0, N] 之间, 则取 M 次 随机数的平均数, M越大, 结果越集中.
    如果要把概率集中点调到 0, 减 N/2 再取绝对值应该可以.
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   2325 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 39ms · UTC 06:24 · PVG 14:24 · LAX 23:24 · JFK 02:24
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.