2016-10-05 4 views
0

Я довольно новый для JavaScript, и я делал в то время как-петли, которые бросают кости и ломает из цикла, когда вы выбросили 6.Петля через массив элементов, используя вероятность

var rollDice = function() { 
    var dice = Math.floor(Math.random() * 6 + 1); 

    while (dice !== 6) { 
    console.log("A " + dice + " was rolled!"); 
    var dice = Math.floor(Math.random() * 6 + 1) 
    } 
    console.log("Lucky! You rolled a 6!"); 
} 

Теперь я хочу перебирать массив элементов и вырываться из него, когда найден нужный элемент. Я хочу, чтобы иметь возможность объявить нужный пункт, как это:

var desiredItem = "Diamond"; 

Однако каждый элемент имеет свое собственное значение вероятности, что я хотел бы включить в это время петли. Это означает, что у вас есть 25% -ный шанс получить ржавый гвоздь, а только 5% -ный шанс получить бриллиант. Так что статистически вы будете получать более ржавые гвозди, чем бриллианты. Я также хотел бы выводить все для пользователя внутри цикла, как это:

console.log("Dang! A " + lootedItem + " was found..."); 

и когда вы, наконец, получить нужный элемент и выйти из цикла:

console.log("Lucky! A" + desiredItem + "was found!"); 

Я примеряю мое собственное какое-то время, но, похоже, не получается, поэтому любая помощь будет оценена по достоинству. Благодаря!

ответ

1

Вот реализация ES6 для этого:

var findItem = function(desiredItem) { 
 
    var items = [ 
 
     { item: "rusty nail", probability: 0.25 }, 
 
     { item: "stone", probability: 0.23 }, 
 
     { item: "banana", probability: 0.20 }, 
 
     { item: "leaf", probability: 0.17 }, 
 
     { item: "mushroom", probability: 0.10 }, 
 
     { item: "diamond", probability: 0.05 } 
 
    ]; 
 
    var possible = items.some(({item, probability}) => 
 
      item === desiredItem && probability > 0); 
 
    if (!possible) { 
 
     console.log('There is no chance you\'ll ever find a ' + desiredItem); 
 
     return; 
 
    } 
 
    var sum = items.reduce((sum, {item, probability}) => sum+probability, 0); 
 
    while (true) { 
 
     var value = Math.random() * sum; 
 
     var lootedItem = items.find( 
 
       ({item, probability}) => (value -= probability) <= 0).item; 
 
     if (lootedItem === desiredItem) break; 
 
     console.log("Dang! A " + lootedItem + " was found..."); 
 
    } 
 
    console.log("Lucky! A " + desiredItem + " was found!"); 
 
} 
 

 
findItem('diamond');

+0

это действительно круто ответ! – Rafael

+0

Спасибо за этот ответ, это было очень полезно! Теперь я хотел бы добавить еще одно значение в массив 'items', называемый' category? , Категории могут быть либо '2',' 5', либо '10'. Итак, скажем, элемент 'diamond' будет принадлежать' category: 10', и когда я запускаю 'findItem', только те предметы, которые относятся к одной категории, включены во все возможности. Я пробовал уже несколько дней, но, похоже, не понимаю. Может ли кто-нибудь подтолкнуть меня в правильном направлении? Спасибо! –

+0

Если у вас есть новый вопрос, вы должны задать ему новый вопрос. Если вы хотите, чтобы я посмотрел на него, вы можете опубликовать здесь ссылку на него, как только вы его создали. В любом случае, я буду в сети в течение следующих 12 часов, так что это вторая причина, чтобы опубликовать его как новый вопрос: он привлечет к нему других людей, которые смогут вам помочь.В новом вопросе вы, конечно, можете вернуться к этому, так как те, кто отвечает, хотят использовать код, размещенный здесь. – trincot

0

Вы можете использовать тот же подход для проблемы с алмазом, который вы используете в своем цикле во время цикла. Просто сгенерируйте случайное число между 1-20, и если число, сгенерированное, например, равно 1, сообщите пользователю, что они нашли алмаз, так как вероятность создания 1 составляет 5%.

0

Ниже приведен общий ответ, позволяющий использовать взвешенные вероятности. Я использовал его с успехом в нескольких играх, которые я написал.

  1. Для каждого элемента дайте положительную оценку. Это не должно быть целым числом , и их не нужно суммировать до 1.
  2. Подсчитайте все вероятности. Назовите это итогом.
  3. Введите число от 0 до Total, aka Math.random() * всего
  4. Для каждого элемента, посмотрите, меньше ли это число для этого элемента. Если это так, верните этот элемент. Если не вычесть вероятность и перейти к следующему элементу.
0
const DIAMOND = 1, 
     TRASH = 0; 

var treasures = [DIAMOND, TRASH, TRASH, TRASH, DIAMOND], 
    len = treasures.length; 

function searchForDiamond() { 
    while (true) { 
     var j = Math.floor(getRandomArbitrary(0, len)), 
      discovery = treasures[j]; 

     if (discovery === DIAMOND) { 
      console.log("I am a lucky pirate!"); 
      break; 
     } else { 
      console.log("I am a crappy pirate!"); 
     } 
    } 
} 

// FROM MDN 
// Returns a random number between min (inclusive) and max (exclusive) 
function getRandomArbitrary(min, max) { 
    return Math.random() * (max - min) + min; 
} 


searchForDiamond(); 
Смежные вопросы