我想知道根据概率获得一个带有两位小数的随机数,例如:
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 :(得分: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();
}
}
该函数将采用具有概率的数组,对于指定概率的每个概率,该概率的最小值,该概率的最大值。它将返回一个带有两位小数的数字。