2016-09-27 98 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/