Prisoner's Thingy With Graph
http://visjs.org/
by asemahle
HTML
<script src="https://cdnjs.cloudflare.com/ajax/libs/vue/2.1.4/vue.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.2/lodash.js"></script>
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/vis/4.11.0/vis.css">
<script src="https://cdnjs.cloudflare.com/ajax/libs/vis/4.11.0/vis.js"></script>
<div id="app">
<div> Max Prisoners: <input type="number" v-model.number="maxPrisoners"> </div>
<div> Step Size: <input type="number" v-model.number="stepSize"> </div>
<div> Num Simulations PerStep: <input type="number" v-model.number="numSimulationsPerStep"> </div>
<button @click="populateData">Resimulate</button>
</div>
<div id="visualization"></div>
JavaScript
new Vue({
el: '#app',
data: {
graph3d: null,
data: null,
maxPrisoners: 100,
stepSize: 10,
numSimulationsPerStep: 500,
graphOptions: {
width: '500px',
height: '552px',
style: 'surface',
showPerspective: true,
showGrid: true,
showShadow: false,
keepAspectRatio: true,
verticalRatio: 0.5,
xLabel: 'Num Tries',
yLabel: 'Num Prisoners',
zLabel: 'Success Rate'
}
},
methods: {
reset() { },
populateData() {
// Create and populate a data table.
this.data = new vis.DataSet();
let counter = 0;
for (let numPrisoners = 0; numPrisoners < this.maxPrisoners; numPrisoners += this.stepSize){
for (let numTries = 0; numTries < this.maxPrisoners; numTries += this.stepSize) {
let successes = 0;
for (let i = 0; i < this.numSimulationsPerStep; i++) {
successes += this.runSimulation(numPrisoners, numTries);
}
this.data.add({
id: counter++,
x: numTries,
y: numPrisoners,
z: successes/this.numSimulationsPerStep,
value: successes/this.numSimulationsPerStep
});
}
}
// Instantiate our graph object.
let container = document.getElementById('visualization');
this.graph3d = new vis.Graph3d(container, this.data, this.graphOptions);
console.log('done');
},
runSimulation(numPrisoners, numTries) {
let success = true;
// create and randomize the drawers
let drawers = [];
for (let i = 0; i < numPrisoners; i++) drawers.push(i);
drawers = _.shuffle(drawers);
// run the sim (each prisoner GO GO GO!)
for (let prisonerNumber = 0; prisonerNumber < numPrisoners; prisonerNumber++) {
// start with drawer equivalent to the prisoner's number
let selection = drawers[prisonerNumber];
// do the algorithm....