using System.Collections.Generic;
using System.Threading.Tasks;
namespace TowerSimulatorWholeUserbase
public double Rewards = 0;
public int RerollsUsed = 0;
public double RerollValue = 0;
public int PercentileOfUserBase;
public int TotalRerollsUsed = 0;
public int TotalPlayers = 0;
public int TotalRerollValue = 0;
public Segment(string name, int percentileOfUserBase, int rerollsToDo)
PercentileOfUserBase = percentileOfUserBase;
RerollsToDo = rerollsToDo;
static void Main(string[] args)
var rerollValues = new List<int> { 20, 30, 60, 120, 240, 240, 240, 240, 240, 240, 240, 240, };
int hundredDiscountCount=0;
double TotalDiscount = 0;
var segments = new List<Segment>()
new Segment("NONPAYER", 50, 0),
new Segment("MINNOW", 75, 1),
new Segment("DOLPHIN", 94, 3),
new Segment("WHALE", 100, 6),
double[] levels = new double[50];
Random rand = new Random();
Console.WriteLine("Enter number of participants");
int numOfParticipants = int.Parse(Console.ReadLine());
List<Player> players = new List<Player>();
double rewardsCummulative = 0;
var totalRerollsUsed = 0;
for (int i = 0; i < numOfParticipants; i++)
var availableContinue = 0;
var luckySegment = rand.Next(1, 100);
Segment playerSegment = null;
foreach (var segment in segments)
if (luckySegment < segment.PercentileOfUserBase)
availableContinue = segment.RerollsToDo;
playerSegment.TotalPlayers += 1;
var player = new Player();
for (; k < levels.Length; k++)
int luckyNumber = rand.Next(1, 101);
if (luckyNumber <= 75 || (k + 1) % 5 == 0 || k == 0)
player.Rewards = levels[k];
if (availableContinue > 0)
var rerollValue = rerollValues[player.RerollsUsed];
playerSegment.TotalRerollsUsed += 1;
playerSegment.TotalRerollValue += rerollValue;
player.RerollValue+= rerollValue;
player.Rewards = levels[k];
rewardsCummulative += player.Rewards;
double discount= 100-player.RerollValue/ player.Rewards*100;
Console.WriteLine("Player number {0} in {1} segment cummulated {2} rewards and completed {3}. level with {4} reroll which is in value= {5}, discount: {6};", i,playerSegment.Name, player.Rewards,k,player.RerollsUsed, player.RerollValue,discount);
Console.WriteLine("Total number of players who got 100% discounted rewards: {0}", hundredDiscountCount);
Console.WriteLine("Avg discount per player {0}", TotalDiscount/10);
int goldSpentOnRerolls = 0;
Console.WriteLine("================================================================================================================");
Console.WriteLine("How much users per segment, rerolls used and total value of those rerolls:");
foreach (var segment in segments)
var total = segment.TotalPlayers;
Console.WriteLine($"Total number of {segment.Name} is {total} and rerolls used is {segment.TotalRerollsUsed} with a total value of {segment.TotalRerollValue}");
goldSpentOnRerolls += segment.TotalRerollValue;
Console.WriteLine("================================================================================================================");
Console.WriteLine("Total value of all rewards players accumulated: " + rewardsCummulative);
Console.WriteLine("Total value of all gold spent on rerolls: " + goldSpentOnRerolls);
Console.WriteLine("Global discount {0}",100-goldSpentOnRerolls/rewardsCummulative*100 );
Console.WriteLine("Again? Y/N");
var doExit = char.Parse(Console.ReadLine()) == 'N';