Flex Monty Hall Problem

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>
This entry was posted in Uncategorized. Bookmark the permalink.