給定[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))的任何編程語言,我更喜歡一個通用解決方案。
這是一個功課題嗎? –
parseInt()不用於將浮點數轉換爲整數。在這裏使用'Math.floor()'。 – Pointy
而不是離散你的光譜和製作地圖,你有沒有考慮制定一套限制? – squid314