2016-09-27 2 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

Выглядит хорошо. Просто нужно вернуть float с двумя десятичными знаками. – 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 отлично подходит и специально подобрано для quesiton 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/

Смежные вопросы