Let's say I'm writing a simple luck game - each player presses Enter and the game assigns him a random number between 1-6. Just like a cube. At the end of the game, the player with the highest number wins.
Now, let's say I'm a cheater. I want to write the game so player #1 (which will be me) has a probability of 90% to get six, and 2% to get each of the rest numbers (1, 2, 3, 4, 5).
How can I generate a number random, and set the probability for each number?
static Random random = new Random();
static int CheatToWin()
{
if (random.NextDouble() < 0.9)
return 6;
return random.Next(1, 6);
}
Another customizable way to cheat:
static int IfYouAintCheatinYouAintTryin()
{
List<Tuple<double, int>> iAlwaysWin = new List<Tuple<double, int>>();
iAlwaysWin.Add(new Tuple<double, int>(0.02, 1));
iAlwaysWin.Add(new Tuple<double, int>(0.04, 2));
iAlwaysWin.Add(new Tuple<double, int>(0.06, 3));
iAlwaysWin.Add(new Tuple<double, int>(0.08, 4));
iAlwaysWin.Add(new Tuple<double, int>(0.10, 5));
iAlwaysWin.Add(new Tuple<double, int>(1.00, 6));
double realRoll = random.NextDouble(); // same random object as before
foreach (var cheater in iAlwaysWin)
{
if (cheater.Item1 > realRoll)
return cheater.Item2;
}
return 6;
}
You have a few options, but one way would be to pull a number between 1 and 100, and use your weights to assign that to a dice face number.
So
1,2 = 1
3,4 = 2
5,6 = 3
7,8 = 4
9,10 = 5
11-100 = 6
this would give you the ratios you need, and would also be fairly easy to tune later.
you can define array of distribution (pseudocode) :
//fair distribution
array = {0.1666, 0.1666, 0.1666, 0.1666, 0.1666, 0.1666 };
then roll the dice from 0 to 1, save to x then do
float sum = 0;
for (int i = 0; i < 6;i++)
{
sum += array[i];
if (sum > x) break;
}
i is the dice number.
now if you want to cheat change array to:
array = {0.1, 0.1, 0.1, 0.1, 0.1, 0.5 };
and you will have 50% to get 6 (instead of 16%)