/// <summary> /// Randomly gets <see cref="ILotteryUser"/> from <see cref="Users"/> list /// </summary> /// <param name="removeWinner">If <c>true</c> user will be removed from <c>Users</c> list</param> /// <returns>Randomly found <see cref="ILotteryUser"/></returns> /// <exception cref="ProfessorMewData.Exceptions.Guild.ProfessorMewException">Thrown when either <see cref="Users"/> or <see cref="Prizes"/> is empty</exception> public ILotteryUser GetWinner(bool removeWinner = false) { if (!CanGetWinner) { throw new ProfessorMewData.Exceptions.Guild.ProfessorMewException("Cannot get winner"); } ILotteryUser winner = null; using (var cryptoRNG = new CryptoRNGCore.RandomNumberGenerator()) { double r = cryptoRNG.GetDouble(0, 1) * Users.Sum(x => x.Tickets); double min = 0, max = 0; foreach (var user in Users) { max += user.Tickets; if (min <= r && r < max) { winner = user; break; } } } if (removeWinner && !winner.IsEmpty) { Users.Remove(winner); } return(winner); }
public static void AddTickets(this ILotteryUser user, int ticketAmount) { if (((long)user.Tickets + ticketAmount) > int.MaxValue) { user.Tickets = int.MaxValue; return; } user.Tickets += Math.Abs(ticketAmount); }
public static void ReduceTickets(this ILotteryUser user, int ticketAmount) { if (((long)user.Tickets - ticketAmount) < int.MinValue) { user.Tickets = int.MinValue; return; } user.Tickets = user.Tickets - Math.Abs(ticketAmount) < 0 ? 0 : user.Tickets - Math.Abs(ticketAmount); }