JSFiddle - React, Tailwind, and code Playground
HTML
<div id="result"></div>
JavaScript
var n, cubicles_total, doom_soon_weight, doom_late_weight, doom_soon_occupied, doom_late_occupied, maxCubicleChecked;
// Set configuration variables
n = 1000;
cubicles_total = 100;
doom_soon_weight = 1;
doom_late_weight = 1;
doom_soon_occupied = 10;
doom_late_occupied = 100;
max_cubicle_checked = doom_soon_occupied;
// Scenarios
function enactDoomSoon(cubicles) {
var doom = [];
for (var i = 0; i < doom_soon_occupied; ++i) doom.push("alive");
console.log('soon: ', doom.length);
doom.length = cubicles.length;
return doom;
}
function enactDoomLate(cubicles) {
var doom = [];
for (var i = 0; i < doom_late_occupied; ++i) doom.push("alive");
doom.length = cubicles.length;
return doom;
}
var total_weight = doom_soon_weight + doom_late_weight;
var doom_threshold = doom_soon_weight;
var soon_occurences = 0;
var late_occurences = 0;
var aliens_occurrences = 0; // Somehow neither doom occured
var doomed_query_occurences = 0;
for (var i = 0; i < n; ++i) {
var cubicles, doom;
// Populate cubicles
cubicles = [];
cubicles.length = cubicles_total;
// God flips a coin
if (Math.random() * total_weight < doom_threshold) {
// There goes our last female...
cubicles = enactDoomSoon(cubicles);
doom = 'soon';
} else {
// Staying alive! Staying Alive!
cubicles = enactDoomLate(cubicles);
doom = 'late';
}
// Check if a random cubicle is occupied
if ('alive' === cubicles[Math.floor(Math.random() * max_cubicle_checked)]) {
if ('soon' === doom)++soon_occurences;
else if ('late' === doom)++late_occurences;
else ++aliens_occurrences;
} else ++doomed_query_occurences;
}
// Output result
document.getElementById('result').innerText = "Soon: " + soon_occurences + "; Late: " + late_occurences + '; Aliens: ' + aliens_occurrences + '; Doomed Query: ' + doomed_query_occurences;