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....