作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
你好。
我正在开发一款游戏中的彩票系统。
我的目标是根据玩家输入的金额和抽奖时的彩票总值(value)随机抽取一名玩家。 E.G Pot 为 100k,玩家 1 投入了 10k,玩家 2 投入了 20k,这意味着玩家 1 有 1/10 的获胜机会,玩家 2 有 2/10 的获胜机会。totalPot
,这是底池的总值(value)randomNR
,这是随机数生成userInput
,这是用户投入抽奖的总输入。玩家
,这是输入上述金额的玩家
我已经尝试过这个:
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;
}
}
但这只会导致同一个玩家被一遍又一遍地吸引。
我不知道该怎么办,非常感谢您的帮助。
最佳答案
您可以迭代所有彩票条目并保留累积总数。累计总数第一次超过中奖号码的玩家获胜。
例如:
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");
}
关于java - 创建抽奖方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50037646/
这个问题已经有答案了: Generate A Weighted Random Number (16 个回答) 已关闭 6 年前。 我有一个像这样的对象: { "user1": 200, "us
我是一名优秀的程序员,十分优秀!