如何从特定比例的数组中选择一个随机值?

问题描述 投票:3回答:3

我正在使用Javascript,我想从数组中选择一个随机值。问题是,实际上我想以特定的比例进行选择。

这是什么意思?

我有以下价值 - 'INFO', 'CRITICAL', 'DEBUG', 'ERROR'

我想用以下比率选择值:

1. INFO - 30% 2. CRITICAL - 5% 3. DEBUG - 55% 4. ERROR - 10%

这就是我目前随机选择一个值的方式 -

var diffSev = ['INFO', 'CRITICAL', 'DEBUG', 'ERROR']
output['testSev'] = diffSev[Math.floor(Math.random() * diffSev.length)];

我想添加一个逻辑,用我需要的比率选择值。谢谢!!

javascript arrays random
3个回答
2
投票

您可以拥有一个大小为20的数组,其中包含标签的相对部分,并表示每个标签的确切百分比。 然后,您需要做的只是1-20的随机,结果将用作索引从数组中进行选择。

 var diffSev = [
 'CRITICAL', 
 'ERROR', 'ERROR',
 'INFO', 'INFO', 'INFO', 'INFO', 'INFO', 'INFO',
 'DEBUG', 'DEBUG', 'DEBUG', 'DEBUG', 'DEBUG', 'DEBUG', 'DEBUG', 'DEBUG', 'DEBUG', 'DEBUG', 'DEBUG'
 ]

 return diffSev[Math.floor(Math.random() * 20)];

0
投票

看概率的积分,而不是概率本身。

由于您使用的是名义值,因此订单不会影响功能,但通过最有可能首先对它们进行排序,您将会(不可检测)性能提升。

function getWeightedSeverity()
{
  var cummprob =[0.55,    0.85,   0.95  , 1.0];  
  var labels   =['DEBUG','INFO','ERROR','CRITICAL'];
  var x=math.random();
  var y=0;
  for (y=0; y<cummprob.length, y++) {
    if (cummprob[y]>=x) break;
  }
  return labels[y];
}

-2
投票

尝试类似的东西

 var diffSev = ['INFO', 'CRITICAL', 'DEBUG', 'ERROR']
 var rand = diffSev[Math.floor(Math.random() * 100)];

switch (rand) {
    case rand < 30 :
        output['testSev'] = diffSev[0]
        break;
    case rand > 30 && rand < 36:
        output['testSev'] = diffSev[1]
        break;
    case rand > 35 && rand < 91:
        output['testSev'] = diffSev[2]
        break;
    case rand > 90:
        output['testSev'] = diffSev[3]
        break;
}
© www.soinside.com 2019 - 2024. All rights reserved.