Code:
//Write a program that simulates a "loaded" die that comes up with the value 1 for half the time
//and some other random value the other half the time.
//This is an exercise from Chapter 2 of book "Microsoft C# programming for the absolute beginner".
//This example is in no way the most elegant solution. It was written strictly for illustrative
//purpose.
using System;
namespace LoadedDieProblemChapter2
{
class Program
{
static void Main(string[] args)
{
Console.WriteLine("Rolling the loaded die:");
LoadedDie loaded = new LoadedDie();
Console.WriteLine(loaded);
Console.WriteLine("\nRolling the normal die:");
NormalDie normal = new NormalDie();
Console.WriteLine(normal);
Console.WriteLine("\nConclusion: try not to play against somebody with a loaded die");
}
}
class LoadedDie
{
//Some field data to see how many ones....sixes we get out of a thousand die rolls
public int ones;
public int twos;
public int threes;
public int fours;
public int fives;
public int sixes;
public int[] dies; //keep the results of die rolls
public LoadedDie()
{
Random r = new Random(); //get Random object
double raw; //will hold the result of r.NextDouble()
int die; //will hold the casted raw
dies = new int[1000];
for (int i = 0; i < 1000; i++) //roll the die 1000 times
{
raw = r.NextDouble(); //get a value in the range [0.0:1.0]
if (raw <= 0.5) //here is the "loaded" logic. In english: load the die to return a given value approximately half of the time
{
dies[i] = die = 1; //the "loaded" value
ones++; //increase the ones count
}
else //what to do with the rest half of the time
{
raw = r.NextDouble(); //regenerate random number. If we would use the previous value of raw, we would lose some values
die = (int)(raw * 6) + 1; //cast the raw to a value in the range [1:6]
dies[i] = die; //store the result
switch (die) //see what value die roll returned, adjust corresponding field
{
case 1: ones++; break;
case 2: twos++; break;
case 3: threes++; break;
case 4: fours++; break;
case 5: fives++; break;
case 6: sixes++; break;
}
}
}
}
public override string ToString() //override ToString() to make it easy to see the results of the 1000 rolls
{
return string.Format("There were {0} rolls\n1's: {1}\n2's: {2}\n3's: {3}\n4's: {4}\n5's: {5}\n6's: {6}",
dies.Length, ones, twos, threes, fours, fives, sixes);
}
}
class NormalDie
{
public int ones;
public int twos;
public int threes;
public int fours;
public int fives;
public int sixes;
public int[] dies;
public NormalDie()
{
Random r = new Random();
double raw;
int die;
dies = new int[1000];
for (int i = 0; i < 1000; i++)
{
raw = r.NextDouble();
die = (int)(raw * 6) + 1;
dies[i] = die;
switch (die)
{
case 1: ones++; break;
case 2: twos++; break;
case 3: threes++; break;
case 4: fours++; break;
case 5: fives++; break;
case 6: sixes++; break;
}
}
}
public override string ToString()
{
return string.Format("There were {0} rolls\n1's: {1}\n2's: {2}\n3's: {3}\n4's: {4}\n5's: {5}\n6's: {6}",
dies.Length, ones, twos, threes, fours, fives, sixes);
}
}
}