根据概率获取随机数

时间:2016-09-27 18:14:46

标签: javascript

我想知道根据概率获得一个带有两位小数的随机数,例如:

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

3 个答案:

答案 0 :(得分: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之间的数字。然后,对于每个类别,我使用SECOND随机数来获取您所说的范围 - 将其置于底层以确保它是一个整数并添加每个范围的起始编号。注意:你最后一个的范围只有5。

我应该解释一下,你必须使用两个随机数,否则第二个数字的范围将取决于你所属的类别。

我必须在地板上做1000 * rnd2,然后在外面除以100,得到你要求的2位小数。

答案 1 :(得分: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);

可能会这样做;

答案 2 :(得分:0)

Rewind的解决方案很棒,专为OP的问题量身定制。更可重用的解决方案可能是:

w =  new BufferedWriter(new OutputStreamWriter(receivedSocketConn1.getOutputStream(),"ISO-8859-15")); //
r = new BufferedReader(new InputStreamReader(receivedSocketConn1.getInputStream(),"ISO-8859-15"));
int nextChar=0;
while ((nextChar=r.read()) != -1) {               
    StringBuilder sb = new StringBuilder();
    sb.append(Integer.toHexString(nextChar));
    if (sb.length() < 2) {
        sb.insert(0, '0'); // pad with leading zero if needed
    }
    String hexChar = sb.toString();
    System.out.println("\n\n hex value is "+Integer.toHexString(nextChar).toUpperCase()+"   "+"Int value is:"+nextChar);          
    message = message+hexChar; 
    String messageID=message.substring(2,6);
    System.out.println("messageId is :"+messageID);
    if(messageID.equals("0100")){
        String replyMessage = "7E81";
        w.write(replyMessage+"\r\n");
        w.flush();
    }
}

该函数将采用具有概率的数组,对于指定概率的每个概率,该概率的最小值,该概率的最大值。它将返回一个带有两位小数的数字。

https://jsfiddle.net/x237w5gv/