美文网首页
leetcode 478 和 470

leetcode 478 和 470

作者: portability | 来源:发表于2018-08-07 02:15 被阅读0次

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.其实三位七进制好与两位,自己想想为什么,微笑。

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

相关文章

网友评论

      本文标题:leetcode 478 和 470

      本文链接:https://www.haomeiwen.com/subject/rawnvftx.html