leetcode 478
該題大意就是如何在圓內(nèi)等概率的取到一個點。因為是圓,所以不是線性均勻的潦蝇,接著就想到了神經(jīng)網(wǎng)絡(luò)中的非線性變換,一種將這個曲面拉直拉均勻的想法喘漏。所以就想到了極坐標(biāo)(r,p),首先我們知道一個圓就是一個r=x的極坐標(biāo)圖像护蝶,所以可以隨意取得一個角度,每個角度上的線上的點的概率和都是1/360翩迈,然后問題轉(zhuǎn)變?yōu)榫€上的點該如何占比才是均勻的持灰。越是靠近圓心,概率占比應(yīng)該越小负饲,越在圓外概率越大堤魁。這是因為圓的面積S=PI*R*R,所以S正比與R*R返十,即S與R*R是線性的妥泉。所以原問題轉(zhuǎn)化成了等概率取[0,2*PI]間的弧度,sqrt([0洞坑,R])的距離的極坐標(biāo)上的點盲链,最后轉(zhuǎn)換成直角坐標(biāo)。
代碼如下:
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)};
}
但是不是很理解為什么弧度要轉(zhuǎn)成int,可能編譯器的例子中的弧度都是int吧刽沾。
470
這是一題級數(shù)題本慕。。侧漓。
題目大意是用一個等概率產(chǎn)生1锅尘。。布蔗。7整數(shù)的rand7隨機(jī)生成函數(shù)構(gòu)造一個rand10的隨機(jī)生產(chǎn)函數(shù)藤违。一開始我還在用與或非門思考,然后發(fā)現(xiàn)破不了纵揍。再然后既然沒有辦法完美得出一個美感的數(shù)學(xué)公式顿乒,那就強(qiáng)擼吧。
等概率10之內(nèi)的正整數(shù)骡男,那么就需要使得每個數(shù)都是1/10的概率淆游,但現(xiàn)在只有1/7的概率,怎么弄隔盛?那只能七進(jìn)制多次(XXXXX這樣的犹菱,每一位X都是0-6的數(shù)),再散射出去吮炕。等概率映射到【1腊脱,10】等價于【0,9】+ 1龙亲,所以可以模10陕凹,但是幾次rand7取到每一位的X最大都是6,無法整除10鳄炉,所以落在最后的就需要再次映射到【0杜耙,9】。舉一個例子如下:
我們采用XX兩位七進(jìn)制拂盯。
rand10:
1佑女、rand7取得個位a,rand7取得第二位b谈竿,七進(jìn)制數(shù)為 ba = b * 7 + a 屬于【0团驱,48】
2、ba < 40的話空凸,可以%10獲得其結(jié)果嚎花;否則再次進(jìn)入rand10函數(shù)
原理:
我們算一下算法的概率:
得到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!!! `
其實結(jié)果可以用級數(shù)求解`1 + x + x^2 + ... + x^n + ...= 1/ (1 - x)`,所以原式等于`4/49 * (1 - 9/49) = 1 /10.bingo`。
再回到這個問題呀洲。其實就是需要把這個概率等概率映射出去紊选,為什么選40啼止,不選39呢?那是因為選39丛楚,9的概率不等分了族壳,你可以選任何10的倍數(shù);那為什么用40趣些,不用30呢?減少了再次散射贰您,40的再散射率只有9/49坏平,而30確是19/49.其實三位七進(jìn)制好與兩位,自己想想為什么锦亦,微笑舶替。
最后就是,有些數(shù)學(xué)還是很有用的杠园。