北京搖號購車採用的是什麼演算法?
02-14
一直很好奇,在限購措施中採用的所謂「搖號」是嚴格隨機(外行人的外行話),還是採用了某種演算法。這種演算法也許涉及了年限、家庭情況(如地址、IP、家人是否一同參與搖號)等。
先答乾貨,步驟如下:
1、把所有當月審核通過的申請碼(13位數)按照從小達大排列,並從1開始編號,設最大編號為N(2014年4月N為2400000左右)。猜測在這一步中,有2個或3個中籤幾率的申請碼,會相應得到2個或3個不同的編號。2、在公證員的公正下,由6個人隨機搖出6個小球,得到6位隨機種子。
3、計算機用.NET Framework 2.0的System.Random類新建一個實例,輸入上述6位隨機種子。4、每次調用Random.Next(int maxValue)函數產生一個[0,N)的整數,對應於上述[1,N]的編號,查出相應的申請碼。驗證這個申請碼是否已經抽到過,以次避免重複抽到一個編號,或者抽到同一申請碼的多個編號。如果這個申請碼未被抽到過,則保存到抽中的結果中。5、重複執行4,直到抽中了當月所有指標為止。.NET Framework中的隨機數屬於偽隨機數,即給定相同的隨機種子,可以得到相同的抽籤結果,這就是為什麼大夥可以自己在家用電腦驗證抽籤結果。
這個偽隨機演算法的源代碼可以參閱MSDN:Reference Source以及代碼中提到的書:Numerical Recipes in C (2nd Ed.)可以說,搖號中6位隨機種子是真隨機數,之後的偽隨機演算法也是均勻分布的,因此抽籤結果是可信的。
上述分析結果,是根據使用.NET reflector反編譯搖號官網上給出的程序得到的。其中第2步是根據曾經看到的某一篇報道寫的(具體鏈接不記得了,歡迎補充)。
至於某些博客中指責搖號程序粗製濫造,實話說,我看代碼時,並沒有這樣的感覺。感覺代碼雖然寫的不精緻,但功能是完善的,結果也是可信的。至於簡單的使用Random.Next()函數,我覺得使用一個公認的有很好分布特性的隨機演算法是非常正確的,比自己開發一個沒有證明過的偽隨機演算法不知高到哪裡去了。。。北京搖號的演算法根據反編譯的北京搖號程序,已經公布了http://www.cnblogs.com/mullex/p/3574203.html
這種平均給人的感覺就是運氣,據說有90多人一次註冊搖號就中了。這是多麼高的概率,對這90多人是100%的成功率。按現在期數有的人已經有十個以上的種子號了。也就是700萬多號裡面一個人有10個號,如果按人數,200多萬人搖1萬8千多個號。
請問是不是目前的房子搖號,也都是這種?
有最近的汽車搖號演算法嗎?現在不是改成搖幾次就多少倍,這個是怎麼算的
推薦閱讀: