你好。的
我正在制作一个我正在进行的游戏中的彩票系统。
我的目标是根据他们的数量输入和绘图时刻的彩票总值随机获得一名玩家。 E.G Pot是100k,Player1输入10k,Player2输入20k,意味着Player1有1/10的获胜机会,而Player2有2/10的获胜机会。
totalPot
,这是底池的总价值
randomNR
,这是随机数生成
userInput
,这是用户输入彩票的总输入。
player
,这是输入上述金额的玩家
我已经尝试过了:
public static void drawLottery() {
int totalPot = lotteryPot - 250;
int randomNR = Misc.randomInt(0, lotteryPot);
List<Player> keys = new ArrayList<Player>(lotteryEntries.keySet());
Collections.shuffle(keys);
for(int i = 0; i < totalPot;) {
for (Player o : keys) {
i += lotteryEntries.get(o);
if (i >= randomNR) {
System.out.println("Winner: " + o.getUsername() + " -> Random number: " + randomNR);
}
break;
}
break;
}
}
但这只会让同一个玩家一次又一次地被吸引。 我不知道该怎么做,非常感谢帮助。
答案 0 :(得分:1)
您可以迭代所有彩票条目并保留累计总数。累计总数超过中奖号码的第一次是获胜的玩家。
例如:
Player 1: 20
Player 2: 30
Player 3: 50
Player 4: 10
中奖号码选择为51.累计总数从20开始。这不超过51,因此玩家1没有获胜。然后我们增加到50.不大于51,玩家2没有赢。然后我们增加到100,大于51,所以玩家3赢了。
public static Player getWinner(int winningNumber, Map<Player, Integer> lotteryEntries)
{
int cumulativeProbability = 0;
for (Map.Entry<Player, Integer> entry : lotteryEntries.entrySet())
{
cumulativeProbability += entry.getValue();
if (cumulativeProbability >= winningNumber)
{
return entry.getKey();
}
}
throw new RuntimeException("Winning number not within total pot size");
}
答案 1 :(得分:0)
用锅来思考你的随机选择。在锅内挑一个号码。为每个玩家定义一个范围。如果挑选的数字在范围内,则此玩家是赢家。
例如,底池是30.玩家1放10,玩家2放20.你选择0到30之间的随机数。让我们说随机给我们23.对应于玩家1的范围是0到10和对应于玩家2的范围是10到30.然后玩家2赢了。
这应该是这样的:
//pick a random number inside the pot
Random rand = new Random();
int randNum = rand.nextInt(totalPot);
//Define the pot range corresponding to a player
int rangeStart = 0;
int rangeEnd = 0;
//go through all enties (all players)
for(Entry entry : lotteryEntries.entries()) {
//Define the range corresponding to this player
value = entry.getValue()
rangeStart = rangeEnd;
rangeEnd += value;
//If the picked random num is in the range, this player is the winner
if( randNum >= rangeStart && randNum < rangeEnd) {
System.out.println("Winner: " + entry.getKey().getUsername()):
System.out.println("randNum: " + randNum);
break;
}
}