我想知道獲得基於概率例如小數點後兩位的隨機數:獲取隨機數基於概率
40% to get number from 1-10
20% to get number from 11-20
30% to get number from 21-30
10% to get number from 31-35
我想知道獲得基於概率例如小數點後兩位的隨機數:獲取隨機數基於概率
40% to get number from 1-10
20% to get number from 11-20
30% to get number from 21-30
10% to get number from 31-35
function Prob(){
var rnd = Math.random(),
rnd2 = Math.random();
if(rnd<0.4) return (1 + Math.floor(1000 * rnd2)/100);
else if(rnd<0.6) return (11 + Math.floor(1000 * rnd2)/100);
else if(rnd<0.9) return (21 + Math.floor(1000 * rnd2)/100);
else return (31 + Math.floor(500 * rnd2)/100);
}
你需要兩個隨機數,所以我在開始計算它們。然後,我使用if-else循環遍歷40%,20%,30%和10%(隨着我的增加)。注意:Math.random返回一個介於0和1之間的數字。然後,對於每個類別,我使用第二個隨機數來獲得您所說的範圍 - 確定它是一個整數並添加每個範圍的起始數字。注意:您的最後一個的範圍僅僅是5
我應該解釋一下,你必須使用兩個隨機數,第二個數字,否則的範圍將取決於你是哪一類
我有。在場內做1000 * rnd2,然後再除以100得到你要求的2位小數位。
我想這
var get1120 = _ => ~~(Math.random()*10)+11,
get2130 = _ => ~~(Math.random()*10)+21,
get3135 = _ => ~~(Math.random()*5)+31,
a = [get3135,get1120,get1120,get2130,get2130,get2130],
fun;
result = (fun = a[~~(Math.random()*10)]) ? fun() : ~~(Math.random()*10)+1;
console.log(result);
可能做到這一點;
Rewind的解決方案非常棒,專門針對OP的問題量身打造。更可重複使用的解決方案可能是:
function getNumber(probabilities){
var rnd = Math.random();
var total = 0;
var hit;
for(var i = 0; i < probabilities.length; i++){
if(rnd > total && rnd < total + probabilities[i][0]){
hit = probabilities[i]
}
total += probabilities[i][0];
}
return Number((hit[1] + (Math.random() * (hit[2] - hit[1]))).toFixed(2));
}
var number = getNumber(
[
//chance, min, max
[0.4, 1, 10],
[0.2,11,20],
[0.3,21,30],
[0.1,31,35]
]
);
console.log(number);
功能將一個數組的概率,每個概率指定的機會,對於這樣的機會的最低值,這樣的機會的最大值。它將返回一個有兩位小數的數字。
生成一個隨機數並使用數字輪。 – Jecoms
您可以使用「加權隨機數」作爲搜索詞。 「概率」通常指的是分佈(正態,泊松等) –
您可以研究如何做到這一點,嘗試實施它,然後再回來,如果你卡住了。 – vlaz