乙個有趣的問題

2021-08-21 14:01:52 字數 1799 閱讀 3742

今早朋友圈某人以100軟妹幣求助這樣乙個問題

概率論是學的一塌糊塗,但是突然想起類似用蒙特卡洛方法可以模擬出來概率。於是向著這100軟妹幣出發了。

但是首先遇到了第乙個問題。陣列b的亂序排列感覺有點棘手。

首先的第一反應是:迴圈隨機產生1-100的隨機數,判斷陣列中是否已經有該數,若已存在,則重新生成隨機數;若不存在,則放入陣列中。 但是測試以後發現效率很低。因為陣列越大以後,最後幾個數字往往需要經過很久的隨機,才能搖到號。

第二種:我們不妨來逆向思考,事先將1-100這間的數順序存入陣列sorce中,隨機產生乙個位置,然後將該索引對應的陣列元素依次放入陣列array中,每次放入乙個數後,都要將該數從source陣列中刪除,而下一次產生的隨機數的範圍也將所縮小。由於已生成的數已經被刪除,所以每次產生的數就不會再重複。

思路三:

不過這個演算法也不是效率最高的方法,該演算法還是存在弊端的,因為在生成了隨機數之後,對整個陣列進行了刪除操作,其實也就是進行了一系列資料的交換,這也是比較耗時的,所以我們可以考慮的是:在保證不進行刪除操作,但也能將產生的數從陣列中剔除的方法。

第一反應想到的應該會給這個數覆蓋上其他的值,那應該賦什麼值呢?0?如果賦0的話,那接下來生成隨機數的範圍就無法再是遞減1的縮小了,那麼有沒有其他的方法呢?可不可以給它賦乙個陣列中還需要存在的數呢?我們不妨將陣列中最後乙個數賦給它,那麼下次隨機數的產生也還能採用思路二中的方法,主要思路如下所示:

假設陣列中的數為:1,2,3,4,5,6

第一次隨機產生的索引為3,即對應的是4,將4寫入array陣列中後,將6賦到array[3]中,則陣列更新為:1,2,3,6,5,6(有效的數其實只有1,2,3,6,5)

第二次隨機產生的索引為4,即對應的是6,將6寫入array陣列中後,將5賦給array[4]中,則陣列更新為:1,2,3,5,5,6(有效的數其實只有1,2,3,5)

第三次隨機產生的索引為1,即對應的是2,將2寫入array陣列中後,將5賦給array[1]中,則陣列更新為:1,5,3,5,5,6(有效的數其實只有1,5,3)

以此類推......

採用這個方法,就不需要再對source陣列中數進行刪除(多次資料交換),而每一次產生隨機數後,只需要執行一次資料交換即可,又在一定程度上提高了程式執行的效率。

乙個有趣的指標問題

是從網上看到的乙個例子 struct s int i int p void main struct s s int p s.i p 0 4 p 1 3 s.p p s.p 1 1 s.p 0 2 問程式會在哪一行死掉 解答 程式執行到最後一行就會報出異常,死掉.具體解答為 首先需要說明的是結構體s,...

乙個有趣的SQL問題。

有朋友近來要我幫忙解決乙個 問題,問題描述 有表,表有3個字段 f1,f2,f3,其中,每個欄位中都可能出現1 9之間的9個數字,現要統計出整個表中1 9各出現的次數。如 f1 f2f311 2123 212在上例中 1 出現了4次,2 出現了4次,3 出現了1次。當然,這個 問題是要求盡可能的用 ...

有趣的乙個mysql問題

同事問道乙個有趣的mysql問題,在乙個有資料的表中,如何修改自增id值從一開始?我的第一反應就是不能無法修改,不能實現。在有表的資料中怎麼能實現自增id值從一開始,邏輯上就行不通。做個試驗 建自增表 mysql create table tb1 id int 11 not null auto in...