在一个单位圆内部均匀采样,即在单位圆内部随机取一个采样点,而每个采样点被取到的概率都是1/Pi。这个问题看似非常简单,但是可能要比想象中复杂一点。这里的采样我们从canonical uniform variable开始,即我们只能够生成从0到1的随机数,而其分布是均匀分布的。
首先,最容易想到的方法就是rejection method。在单位圆的外部做一个Bounding Box,紧紧的包住这个单位圆。然后用两个随机点分别在两个轴向上取点,从而均匀的随机提取正方形内部的一个点。然后进行简单的测试,当这个点与圆的中心距离大于1的时候,我们按照刚才做法重新生成一个随机点,直到其在圆的内部为止。那么这个点就是我们想要的点了,而且是完全均匀分布的。
这种方法是rejection sampling method的一种,最大的优点在于简单,易于实现。但是在效率方面,这种方法会有很大弊端。我们在选取到最终结果之前,很可能需要生成很多随机点,当随机数生成算法代价足够大的时候,这种方法的效率是不高的。从面积的比率来看,随机点被接受和拒绝的比例为Pi/(4-Pi)。
那么,有没有更合适的方法呢?
还有一种叫做inverse sampling method的方法可以被应用,这种方法的要求可能多一些,需要函数是可积的,并且CDF是可逆的。好在这个例子里面,我们可以把问题变简单一些。
除了上述想法,最直观的想法就是用极坐标系来生成随机点。我们假设有两个从0到1的随机数,a,b。那么,我们另:
      r = a
      theta = b * 2 * Pi
上述随机点显然可以布满整个圆,但是并不是均匀分布的。简单证明如下,如果上述算法可以均匀生成随机点,那么我们假设r0为0到1之间的一个固定数值。由于r=a,而theta不影响点到圆心的距离,所以点在以r0为半径的圆内部的概率为P(a < r0) = r0。而从面积角度讲,点在以r0为半径的圆内部的概率应该是该面积与单位圆的面积比例,即r0*r0。由于r0在0和1之间,显然r0!=r0*r0。所以我们的假设是不成立的,即上述算法不是均匀分布的。
实际上,通过inverse sampling method,我们可以计算出正确的生成算法,即
      r = sqrt( a )
      theta = b * 2 * Pi
上述算法就是满足要求的了,即可以在圆的内部均匀分布了。而且不想rejection method,这回我们只需要生成两个随机数而已,效率有了一定的提升。
表面上来看,该方法似乎很完美,但是这种变换的局部性保持的很差,所以很多应用中效果都不好。例如下图:
左边是原始随机数(a,b)生成的坐标系(我们假设有这样的坐标系),右边是经过了上述变换后的均匀采样,我们发现图片中的F已经完全走样了,基本上看不出来了。而且更糟糕的是,这种连续不是双向的。即在(a,b)的坐标系中,如果两点连续,那么投影到圆后的两个点同样是连续的。而反过来就不一定成立了。
所以,是否有更好的方法呢?
Peter Shirley很早就有一篇文章A Low Distortion Map Between Disk and Square,介绍了一种更好的根据均匀分布的随机采样,可以用来采样圆。
这个方法也不难理解,它把一个正方形通过一些简单的数学变换压缩成了一个圆的形状。变换如下:
     r = a
     theta = Pi * b / ( 4 * a )
可以想象,通过上诉变换,我们可以把正方形压缩成圆的形状
这种变换的好处在于,它可以保持局部性以及双向的邻接性质。我们再看看上面的F在这种变换下,变成了什么形状:
虽然有了一定的扭曲,但是我们还可以清晰的看到里面的F形状,而且要比第二种变换清晰很多。
这种变换被作者称之为Concentric Map。那么最后的问题出现了,这种变换后,采样还是均匀分布么?
对于这个问题而言,我们只需要找到p(a,b)与p(r,theta)之间的关系就好了,而这两者的关系是不难计算的:
    p(a,b) = 0.25
    p(u,v) = p(a,b) / |J_T|
其中
    u = a * cos( Pi * b / ( 4 * a ) )
    v = a * sin( Pi * b / ( 4 * a ) )
J_T为Jacobian行列式,通过计算我们得到
    所以p(u,v) = 0.25 / ( Pi / 4 ) = 1 / Pi,即在圆内部每一点被采样到的概率都为1/Pi,所以上述变换为均匀分布。

PBRT学习笔记:在单位圆内部均匀采样相关推荐

  1. 5214页PDF的进阶架构师学习笔记,阿里巴巴内部Jetpack宝典意外流出

    背景 在深度使用 Flutter 开发过程中,我们遇到了业务代码耦合严重,代码可维护性糟糕,如入泥泞.我们需要一个统一的应用框架来摆脱当下的开发困境,而这也是 Flutter 领域空缺的一块处女地. ...

  2. 【theano-windows】学习笔记十八——混合蒙特卡洛采样

    #前言 继续之前的Theano学习,本次主要学习混合蒙特卡洛(Hybrid Monte-Carlo Sampling)采样算法. 国际惯例,参考网址 Hybrid Monte-Carlo Sampli ...

  3. Apollo学习笔记(24)基于采样的路径规划算法

    之前的文章都是基于搜索的路径算法,这两天在又学习了一下基于采样的路径规划算法,这里做一下记录,最后会奉上大神的链接 基于采样的路径规划算法大致可以分为综合查询方法和单一查询方法两种. 前者首先构建路线 ...

  4. STM32学习笔记:读写内部Flash。

    首先我们需要了解一个内存映射:    stm32的flash地址起始于0x0800 0000,结束地址是0x0800 0000加上芯片实际的flash大小,不同的芯片flash大小不同. RAM起始地 ...

  5. 【学习笔记】CO内部订单

    内部订单 一.用途 主要用途是归集跨部门之间的费用,将其分摊到相应的成本中心或直接费用化. 比如在生产环节,我们可以用内部订单归集新产品研发费用(跨部门合作的情况). 简单理解为"专项费用& ...

  6. STM32学习笔记:读写内部Flash(介绍+附代码)

    一.介绍 首先我们需要了解一个内存映射: stm32的flash地址起始于0x0800 0000,结束地址是0x0800 0000加上芯片实际的flash大小,不同的芯片flash大小不同. RAM起 ...

  7. STM32+FreeRTOS+CUBEMX_学习笔记(五 )ADC采样

    ADC的各种模式 前言 1.STM系列ADC的参数: 2.ADC的几种工作模式 单次转换模式 连续转换模式 DMA 双ADC模式 3.函数 4.具体操作 参考资料 前言 ADC采样是一种常见的功能 1 ...

  8. SpringCloud学习笔记021---SpringBoot修改内部Tomcat默认端口

    在spring boot的web 工程中,可以使用内置的web container.有时需要修改服务端口. 方法一:通过配置类和@Configuration注解来完成 import org.sprin ...

  9. 2020-4-5 深度学习笔记17 - 蒙特卡罗方法 3 ( 马尔可夫链蒙特卡罗方法MCMC-先验分布/后验分布/似然估计,马尔可夫性质)

    第十七章 蒙特卡罗方法 中文 英文 2020-4-4 深度学习笔记17 - 蒙特卡罗方法 1 (采样和蒙特卡罗方法-必要性和合理性) 2020-4-4 深度学习笔记17 - 蒙特卡罗方法 2 ( 重要 ...

  10. 频域补零上采样_AURIX 学习笔记(12)频域法互相关实现超声测距

    概述 上一篇 AURIX 学习笔记(11)外部中断以及基于时域互相关的超声测距 介绍了 TC264D 实现超声波测距应用的结构.原理等,也提到时域法的不足:计算复杂度高.滤波手段少.没有充分利用单片机 ...

最新文章

  1. 【GoLang】tcmalloc jemalloc
  2. CSS里面position:relative与position:absolute 区别
  3. 【Linux 内核】宏内核与微内核架构 ( 操作系统需要满足的要素 | 宏内核 | 微内核 | Linux 内核动态加载机制 )
  4. CSS3中:nth-child和:nth-of-type的区别深入理解。 关于:nth-child和:nth-of-type的区别之前一直没太注意,经深入理解才发现里面其实暗藏玄机...
  5. 浅谈爬虫 《一》 ===python
  6. C#LeetCode刷题之#434-字符串中的单词数​​​​​​​(Number of Segments in a String)
  7. 一开机未通过输入密码登录,就出现用户名或密码错误??
  8. 第7章[7.22] Ext JS类的继承与混合
  9. 不止 RTC 技术盛会,你还应该知道的声网给开发者的福利
  10. Android设置状态栏为白底黑字
  11. 3种时间复杂度实现不同类型的无序数组去重
  12. 心电图是模拟计算机吗,心电图仪
  13. git切换到旧版本_git如何更新到指定版本,然后再更新到最新版本
  14. 为什么晚睡晚起的人会更聪明?
  15. 解决office 2003安装了office 2007兼容包还是打不开office 2007的文件
  16. DDR的VTT有源端接和无源端接(slua886a笔记)
  17. 学术论文投稿第五弹——如何写Discussion
  18. 科学家学习天竺葵特性,研制出用水分子来驱动的微型机器人
  19. 自定义View入门实战案例详析 | 蜘蛛网DataShowView
  20. 在VMware vCenter中使用企业CA或第三方CA替换VMCA

热门文章

  1. bzoj 4484: [Jsoi2015]最小表示
  2. English:英语学习口诀(实用)
  3. IOS中impactor报81错误解决方法
  4. 为中国的孩子制造安全的校车
  5. @kubernetes(k8s)使用adm安装实现keepalived高可用
  6. C++ 多态(2): 纯虚函数, 抽象类和接口类
  7. 类似于android短信校验码的demo
  8. 判断char*是否为utf8编码
  9. Spring boot的定时任务调度
  10. Jenkins集成Django