leetcode 478 和 470

leetcode 478

该题大意就是如何在圆内等概率的取到一个点。因为是圆,所以不是线性均匀的,接着就想到了神经网络中的非线性变换,一种将这个曲面拉直拉均匀的想法。所以就想到了极坐标(r,p),首先我们知道一个圆就是一个r=x的极坐标图像,所以可以随意取得一个角度,每个角度上的线上的点的概率和都是1/360,然后问题转变为线上的点该如何占比才是均匀的。越是靠近圆心,概率占比应该越小,越在圆外概率越大。这是因为圆的面积S=PI*R*R,所以S正比与R*R,即S与R*R是线性的。所以原问题转化成了等概率取[0,2*PI]间的弧度,sqrt([0,R])的距离的极坐标上的点,最后转换成直角坐标。

代码如下:

public double[] randPoint() {

        double ca = (int) (Math.random() * 360);

        double cr = Math.sqrt(Math.random()) * r;


        return new double[]{x + cr * Math.cos(ca),

                          y + cr* Math.sin(ca)};

}

但是不是很理解为什么弧度要转成int,可能编译器的例子中的弧度都是int吧。


470

这是一题级数题。。。

题目大意是用一个等概率产生1。。。7整数的rand7随机生成函数构造一个rand10的随机生产函数。一开始我还在用与或非门思考,然后发现破不了。再然后既然没有办法完美得出一个美感的数学公式,那就强撸吧。

等概率10之内的正整数,那么就需要使得每个数都是1/10的概率,但现在只有1/7的概率,怎么弄?那只能七进制多次(XXXXX这样的,每一位X都是0-6的数),再散射出去。等概率映射到【1,10】等价于【0,9】+ 1,所以可以模10,但是几次rand7取到每一位的X最大都是6,无法整除10,所以落在最后的就需要再次映射到【0,9】。举一个例子如下:

我们采用XX两位七进制。

rand10:

1、rand7取得个位a,rand7取得第二位b,七进制数为 ba = b * 7 + a 属于【0,48】

2、ba < 40的话,可以%10获得其结果;否则再次进入rand10函数


原理:

我们算一下算法的概率:

得到1的概率定义为`P(1) = 4 / 49 + 9 / 49 * 4/49 + 4 / 49 *(9/49)^2 + ... + (9/49)^n + ... = 4/49*(1 + 9/49 + ...)=4/49 * [(1 - (9/49)^n) /(1 - 9/49) = 4/49 * 49/40 = 1/10 get it!!! `

其实结果可以用级数求解`1 + x + x^2 + ... + x^n + ...= 1/ (1 - x)`,所以原式等于`4/49 * (1 - 9/49) = 1 /10.bingo`。

再回到这个问题。其实就是需要把这个概率等概率映射出去,为什么选40,不选39呢?那是因为选39,9的概率不等分了,你可以选任何10的倍数;那为什么用40,不用30呢?减少了再次散射,40的再散射率只有9/49,而30确是19/49.其实三位七进制好与两位,自己想想为什么,微笑。


最后就是,有些数学还是很有用的。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 1. 关于诊断X线机准直器的作用,错误的是()。 (6.0 分) A. 显示照射野 B. 显示中心线 C. 屏蔽多...
    我们村我最帅阅读 13,713评论 0 5
  • 首页 资讯 文章 资源 小组 相亲 登录 注册 首页 最新文章 IT 职场 前端 后端 移动端 数据库 运维 其他...
    Helen_Cat阅读 9,395评论 1 10
  • 从懂事就喜欢,温馨和睦的家。小时候很穷,也会打打小架吵吵嘴,但几姐弟还是挺团结的。围着小圆桌吃着酸豆角喝着粥,瞒着...
    馨儿问好阅读 1,937评论 2 3
  • 颜控小阿阅读 1,443评论 3 2
  • 我搬起砖头就无法拥抱你,我放下砖头去拥抱你,就没法养活你。 等到我既能拥抱你又能养活你的时候,你已...
    5af1b74e835a阅读 8,769评论 0 1