示例#1
0
        /// <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);
        }
示例#2
0
        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);
        }
示例#3
0
        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);
        }