這受到面試時的問題的啓發:您如何有效生成N個唯一的隨機數?他們的安全和分配/偏見並不重要。在小於O(N)的情況下生成N個準隨機數
我提出了一種天真的方式來調用rand()N次,並通過反覆試驗來消除模糊,從而導致效率低下和有缺陷的解決方案。然後我讀了this SO question,這些算法非常適合獲得高質量的唯一數字,它們是O(N)。
但我懷疑有辦法獲得低於O(N)時間複雜度的虛擬任務的低質量唯一隨機數。我有一些可能的想法:
- 存儲許多預先計算的列表,每個包含N個數字並隨機檢索一個列表。對於固定的N,複雜度爲O(1)。使用的存儲空間是O(NR),其中R是列表的數量。
- 生成N/2個唯一隨機數,然後將它們除以2個不等的部分(奇數的floor/ceil,even的n + 1/n-1)。我知道這是有缺陷的(重複彈出)和O(N/2)仍然是O(N)。這更多是一種思考的食物。
- 生成一個大的隨機數,然後通過一些固定的操作(比特化操作,因式分解,遞歸,MapReduce或其他方法)從中擠出更多的變體。
- 以某種方式使用quasi-random sequence(不是數學家,只是搜索這個詞)。
您的想法?
他們抱怨說你的解決方案的O型複雜度太高,或者太低效了?因爲在給定範圍內生成_unique_數字的方法比試驗和錯誤更有效。另外,你的解決方案不是O(n)最壞的情況 - 爲了從n生成n的隨機置換,由於需要的重試次數,它將在O(n^2)時間內運行。 – 2012-04-11 04:45:03