2014-02-26 45 views
0

給定[0,1]中的均勻分佈的隨機數,我如何根據數字所在的區域來映射結果?這裏是一個片段一個天真的解決方案從my jsfiddle如何映射O(1)中的連續隨機變量?

function mapRandomNumber(){ 
    var randomNumber = Math.random(); 
    if(randomNumber < 0.2){ // 20% 
     return 0; 
    } else if(randomNumber < 0.3){ // 10% 
     return 1; 
    } else if(randomNumber < 0.5){ // 20% 
     return 2; 
    } else if(randomNumber < 0.65){ // 15% 
     return 3; 
    } else if(randomNumber < 0.9){ // 25% 
     return 4; 
    } else { // 10% 
     return 5; 
    } 
} 

但如果我有幾十或幾百個案例?這意味着數十個和數百個if-elses,這是不優雅,難以修改。

對於簡單情況(對於理性概率),一個O(1)答案是採取隨機數,離散化並映射這些結果。下面是用3個數字爲例:

numberMap = { 
    0: 0, // 1/3% 
    1: 0, // 1/3% 
    2: 1 // 1/3% 
} 

function mapRandomNumber(){ 
    var randomNumber = Math.random(); // [0, 1) 
    randomNumber = randomNumber*3; // [0, 3) 
    randomNumber = Math.floor(randomNumber); // 0 or 1 or 2 
    // returns zero 2/3 of the time, and returns one 1/3 of the time 
    return numberMap[randomNumber]; 
} 

這並不真正適用於非理性的概率和可能是低效的大地圖可以看到許多映射應該返回相同的結果。

對於具有恆定時間複雜度(O(1))的任何編程語言,我更喜歡一個通用解決方案。

+0

這是一個功課題嗎? –

+0

parseInt()不用於將浮點數轉換爲整數。在這裏使用'Math.floor()'。 – Pointy

+0

而不是離散你的光譜和製作地圖,你有沒有考慮制定一套限制? – squid314

回答

0
var limits = [ 
    0.001, 
    0.01, 
    0.1, 
    0.3, 
    0.30001, 
    0, // this deletes this index from the output 
    0.7, 
    0.9, 
    1]; 

function mapNumber(num) { 
    for (var i=0; i<limits.length; i++) { 
     if (num <= limits[i]) 
      // here we simply map to the index, but the values in the limits 
      // array could also be used to store the mapping value. 
      return i; 
    } 
} 

console.log(mapNumber(0)); // 0 
console.log(mapNumber(0.000000001)); // 0 
console.log(mapNumber(0.015)); // 2 
console.log(mapNumber(0.4)); // 6 
+0

這與我的第一個解決方案實際上是一樣的,清理了一下。這裏的問題是仍然在使用cpu的條件。如果我說有1000萬的「限制」,那麼在最壞的情況下,我必須執行1000萬條if語句來查看我的隨機數是否落在最後一個區域。我想避免這種情況。 – user3352495

+0

如果您知道您的限制列表已排序(或者您已將其排序),那麼您可以使用各種算法來避免線性行爲。想到[二進制搜索](https://en.wikipedia.org/wiki/Binary_search_algorithm)。它將您的測試次數從「n/2」平均減少到「log_2(n)」。試一試,讓我知道如果你嘗試一兩次後需要幫助。 – squid314

+0

我澄清了包括O(1)的問題。這就是我說的映射隨機變量的意思。我對非O(1)解決方案不感興趣。 – user3352495