I made this quick example in Flex and AS3 to test different outcomes for the Monty Hall problem. View a demo here.
<?xml version="1.0" encoding="utf-8"?>
<s:Application xmlns:fx="http://ns.adobe.com/mxml/2009"
xmlns:s="library://ns.adobe.com/flex/spark"
xmlns:mx="library://ns.adobe.com/flex/mx"
minWidth="500" minHeight="610"
creationComplete="application1_creationCompleteHandler(event)"
viewSourceURL="srcview/index.html">
<fx:Script>
<![CDATA[
import flash.net.navigateToURL;
import mx.charts.PieChart;
import mx.collections.ArrayCollection;
import mx.events.FlexEvent;
[Bindable]
public var dp:ArrayCollection;
public var outputNum:int;
protected function application1_creationCompleteHandler(event:FlexEvent):void
{
outputText.appendText("Click a button to process random tests.\n");
}
public function changeAlways():Boolean
{
var array:Array = new Array();
var winPosition:int = Math.random() * 3;
array[winPosition] = "Car";
var guess:int = Math.random() * 3;
if (array[guess] == "Car")
{
if (outputNum < 50) outputText.appendText("You won a car on your first guess!\n");
return true;
} else
{
array[guess] = "Guess";
//the goat
var goat:int = -1;
while (goat != -1)
{
var tmp:int = Math.random()*3;
if (array[tmp] != "Car" && array[tmp] != "Guess") goat = tmp;
}
array[goat] = "Goat";
//change your guess
for (var i:int; i<array.length; i++)
{
if(array[i] != "Guess" && array[i] != "Goat")
{
if(array[i] == "Car")
{
if (outputNum < 50) outputText.appendText("You won a car on your second guess!\n");
return true;
} else {
if (outputNum < 50) outputText.appendText("You lost!\n");
return false;
}
}
}
return false;
}
}
public function changeNever():Boolean
{
var array:Array = new Array();
var winPosition:int = Math.random() * 3;
array[winPosition] = "Car";
var guess:int = Math.random() * 3;
if (array[guess] == "Car")
{
if (outputNum < 50) outputText.appendText("You won a car!\n");
return true;
} else {
if (outputNum < 50) outputText.appendText("You lost!\n");
return false;
}
}
protected function alwaysChangeBtn_clickHandler(event:MouseEvent):void
{
var numTrials:int = int(numTrialsInp.text);
if (numTrials >= 0) {
outputNum = 0;
outputText.text = "Sample Results ("+numTrials+"):\n";
var won:int = 0;
var lost:int = 0;
for(var i:int; i<numTrials; i++)
{
if(changeAlways())
{
won++;
} else {
lost++;
}
outputNum++;
}
dp = new ArrayCollection([{Label:"Won",Data:won},{Label:"Lost",Data:lost}]);
if (outputNum >= 100) {
outputText.appendText("... done\n");
} else {
outputText.appendText("done\n");
}
}
}
protected function neverChangeBtn_clickHandler(event:MouseEvent):void
{
var numTrials:int = int(numTrialsInp.text);
if (numTrials >= 0) {
outputNum = 0;
outputText.text = "Sample Results ("+numTrials+"):\n";
var won:int = 0;
var lost:int = 0;
for(var i:int; i<numTrials; i++)
{
if(changeNever())
{
won++;
} else {
lost++;
}
outputNum++;
}
dp = new ArrayCollection([{Label:"Won",Data:won},{Label:"Lost",Data:lost}]);
if (outputNum >= 100) {
outputText.appendText("... done\n");
} else {
outputText.appendText("done\n");
}
}
}
protected function labelResults(data:Object, field:String, index:Number, percentValue:Number):String
{
return data.Label + " " + Math.round(data.Data/int(numTrialsInp.text)*100) + "%";
}
protected function whatIs_clickHandler(event:MouseEvent):void
{
navigateToURL(new URLRequest("http://en.wikipedia.org/wiki/Monty_Hall_problem"));
}
]]>
</fx:Script>
<fx:Declarations>
<!-- Place non-visual elements (e.g., services, value objects) here -->
<!--<fx:String id="butterfly2">Purple</fx:String>-->
</fx:Declarations>
<s:VGroup x="10" y="10">
<s:Label fontSize="20" fontWeight="bold" text="Monty Hall Probability"/>
<s:HGroup>
<s:Button id="alwaysChangeBtn" label="Always Change" click="alwaysChangeBtn_clickHandler(event)"/>
<s:Button id="neverChangeBtn" label="Never Change" click="neverChangeBtn_clickHandler(event)"/>
<s:TextInput id="numTrialsInp" text="100" textAlign="right"/>
</s:HGroup>
<s:TextArea id="outputText" width="372" height="233"/>
<mx:LinkButton id="whatIs" label="What is the Monty Hall problem?"
click="whatIs_clickHandler(event)"/>
<mx:PieChart id="piechart1" dataProvider="{dp}" fontSize="14">
<mx:series>
<mx:PieSeries labelField="Label" labelPosition="inside" labelFunction="labelResults" nameField="Label" displayName="Series 1" field="Data">
<!-- Clear the drop shadow filters from the chart. -->
<mx:filters>
<fx:Array/>
</mx:filters>
</mx:PieSeries>
</mx:series>
</mx:PieChart>
</s:VGroup>
</s:Application>