2016-09-27 106 views
-1

我想知道獲得基於概率例如小數點後兩位的隨機數:獲取隨機數基於概率

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 
+0

生成一個隨機數並使用數字輪。 – Jecoms

+1

您可以使用「加權隨機數」作爲搜索詞。 「概率」通常指的是分佈(正態,泊松等) –

+1

您可以研究如何做到這一點,嘗試實施它,然後再回來,如果你卡住了。 – vlaz

回答

3
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位小數位。

+0

看起來不錯。只需要返回一個有兩位小數的浮點數。 – Jecoms

+0

Jecoms - 你需要兩個隨機數字。我在我的回答中已經解釋了更多。否則,範圍隨機部分將取決於您所在的類別。此外,爲什麼我需要一個浮點數爲2個十位的浮點數? – Rewind

+0

這是在問題中提到的。 – Jecoms

0

我想這

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);

可能做到這一點;

0

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); 

功能將一個數組的概率,每個概率指定的機會,對於這樣的機會的最低值,這樣的機會的最大值。它將返回一個有兩位小數的數字。

https://jsfiddle.net/x237w5gv/