Допустим, у меня есть эти два массива

let players = ["ryan", "austin", "julian", "kelso", "mitch", "adam", "dwight", "edwin", "connor", "george"]
let roles = []

Я хотел бы заполнить роли , скажем, 30% строк "хорошо" и 70% "плохо" в случайном порядке, но всегда 30% строк "хорошо".

example: roles: ['Bad','Bad','Bad','Bad','Good','Bad','Bad','Bad','Good','Good']

В настоящее время я использую этот сценарий, который случайным образом создает массив, но без процентных требований «Хорошо» и «Плохо».

players: [ ]
roles: []

while (good === false || bad === false) {
    roles = []
    for (i = 0; i < players.length; i++) {
        let randomise = Math.floor(Math.random() * 2)
        if (randomise === 0) {
            roles.push("Good")
            innocent = true
        } else {
            roles.push("Bad")
            traitor = true
        }
    };
}

Не могу понять, как я могу достичь своей цели.

0
Ryan 3 Сен 2020 в 08:40

2 ответа

Лучший ответ

Определите, сколько игроков должно быть хороших, умножив на 3 / 10 ceil d. В цикле поместите в массив случайное хорошее или плохое значение. Но также проверьте, достигли ли вы предела хороших или плохих значений для нажатия, и в этом случае нажмите другое значение

const players = ["ryan", "austin", "julian", "kelso", "mitch", "adam", "dwight", "edwin", "connor", "george"]
let goodCount = Math.ceil(players.length * 3 / 10);
console.log('Need total of', goodCount, 'good');
const roles = []
for (let i = 0; i < players.length; i++) {
  if (goodCount === 0) {
    // Rest of the array needs to be filled with bad:
    roles.push('Bad'); continue;
  }
  if (goodCount === players.length - roles.length) {
    // Rest of the array needs to be filled with good:
    roles.push('Good'); goodCount--; continue;
  }
  if (Math.random() < 0.3) {
    roles.push('Good'); goodCount--;
  } else {
    roles.push('Bad');
  }
};
console.log(roles);

Не забудьте использовать const вместо let, когда это возможно, и не забывайте всегда объявлять свои переменные перед их использованием (например, i в цикле for), иначе вы неявно создадите глобальные переменные и выдают ошибки в строгом режиме.

2
CertainPerformance 3 Сен 2020 в 05:58

Почему бы вам просто не сгенерировать массив из 70% «плохих» и 30% «хороших», а затем перемешать этот массив:

const players = ["ryan", "austin", "julian", "kelso", "mitch", "adam", "dwight",  "edwin", "connor", "george"];
const roles = [];

const badNum = Math.floor(0.7 * players.length);
const goodNum = players.length - badNum;

for (let i = 1; i <= players.length; i++) {
    roles.push(i <= badNum ? "bad" : "good");
}

//Shuffle roles
for (let i = 0; i < roles.length; i++) {
    var randomIndex = Math.floor(Math.random() * (roles.length - i)) + i;
    var selection = roles[randomIndex];
    var extract = roles[i];
    roles[i] = selection;
    roles[randomIndex] = extract;
}
0
Terence 3 Сен 2020 в 06:18