英文:
Calculate how many more points to get a set percentage
问题
I'm trying to work out how many more wins are needed to get a certain win/loss ratio, but I can't get my head around how to work it out.
我试图计算需要多少更多的胜利才能达到特定的胜率,但我无法弄清楚如何计算。
I have the win ratio, and total number of battles
我有胜率和总战斗次数
For example, I have 112 battles, and a 50% win rate, how many more wins do I need to get to 70%
例如,我有112场战斗,胜率为50%,我需要多少更多的胜利才能达到70%
So far I have the below, but I'm not getting the values I'm expecting. There's probably an easier way of doing this as well.
到目前为止,我有以下内容,但我得到的值与我期望的不符。可能还有更简单的方法。
func calculateNeededWins() {
// Convert to Double
guard let currentRatioDouble = Double(currentRatio) else {return}
guard var currentBattlesInt = Double(currentBattles) else {return}
NSLog("Current Win Ratio: \(currentRatioDouble)")
NSLog("Total Battles: \(currentBattlesInt)")
// Convert Ratio to Decimal
let currentRatioDecimal = (currentRatioDouble / 100)
NSLog("Current Win Ratio (Decimal): \(currentRatioDecimal)")
var totalWins = currentRatioDecimal * currentBattlesInt
NSLog("Total Wins: \(totalWins)")
NSLog("------------")
let currentWins = totalWins
guard var currentPercentage = Int(currentRatio) else {return}
let needRatio = neededRatio * 10
var needWins = 0
NSLog("Loop Start")
// Add 1 to both wins & total battles until win ratio = required
while(currentPercentage <= needRatio) {
NSLog("Current %: \(currentPercentage)")
NSLog("Wins %: \(totalWins)")
NSLog("Total %: \(currentBattlesInt)")
NSLog("------------")
currentBattlesInt += 1
totalWins += 1
needWins += 1
let newPercentage = currentBattlesInt * totalWins
NSLog("New %: \(newPercentage)")
NSLog("Wins %: \(totalWins)")
NSLog("Total %: \(currentBattlesInt)")
NSLog("************************************************************")
currentPercentage = Int(newPercentage)
}
neededWinsString = "\(needWins)"
currentWinsString = "\(currentWins)"
}
This results with
>Current Win Ratio: 50.0
>Total Battles: 112.0
>Current Win Ratio (Decimal): 0.5
>Total Wins: 56.0
>------------
>Loop Start
>Current : 50
>Wins : 56.0
>Total : 112.0
>------------
>New : 6441.0
>Wins : 57.0
>Total : 113.0
英文:
I'm trying to work out how many more wins are needed to get a certain win/loss ratio, but I can't get my head around how to work it out.
I have the win ratio, and total number of battles
For example, I have 112 battles, and a 50% win rate, how many more wins do I need to get to 70%
So far I have the below, but I'm not getting the values I'm expecting. There's probably an easier way of doing this as well.
func calculateNeededWins() {
// Convert to Double
guard let currentRatioDouble = Double(currentRatio) else {return}
guard var currentBattlesInt = Double(currentBattles) else {return}
NSLog("Current Win Ratio: \(currentRatioDouble)")
NSLog("Total Battles: \(currentBattlesInt)")
// Convert Ratio to Decimal
let currentRatioDecimal = (currentRatioDouble / 100)
NSLog("Current Win Ratio (Decimal): \(currentRatioDecimal)")
var totalWins = currentRatioDecimal * currentBattlesInt
NSLog("Total Wins: \(totalWins)")
NSLog("------------")
let currentWins = totalWins
guard var currentPercentage = Int(currentRatio) else {return}
let needRatio = neededRatio * 10
var needWins = 0
NSLog("Loop Start")
// Add 1 to both wins & total battles until win ratio = required
while(currentPercentage <= needRatio) {
NSLog("Current %: \(currentPercentage)")
NSLog("Wins %: \(totalWins)")
NSLog("Total %: \(currentBattlesInt)")
NSLog("------------")
currentBattlesInt += 1
totalWins += 1
needWins += 1
let newPercentage = currentBattlesInt * totalWins
NSLog("New %: \(newPercentage)")
NSLog("Wins %: \(totalWins)")
NSLog("Total %: \(currentBattlesInt)")
NSLog("************************************************************")
currentPercentage = Int(newPercentage)
}
neededWinsString = "\(needWins)"
currentWinsString = "\(currentWins)"
}
This results with
>Current Win Ratio: 50.0
>Total Battles: 112.0
>Current Win Ratio (Decimal): 0.5
>Total Wins: 56.0
>------------
>Loop Start
>Current : 50
>Wins : 56.0
>Total : 112.0
>------------
>New : 6441.0
>Wins : 57.0
>Total : 113.0
答案1
得分: 1
定义一些变量:
- r<sub>t</sub> = 目标胜率
- r<sub>c</sub> = 当前胜率
- b<sub>c</sub> = 至今进行的战斗数
- w<sub>a</sub> = 需要额外获胜的数量
通过一些代数运算,我们可以推断出解决方案:
w<sub>a</sub> = ((r<sub>t</sub> - _r<sub>c</sub>) ⨉ b<sub>c</sub>) / (1 - r<sub>t</sub>)
显然,我们需要将答案四舍五入到最接近的整数。
因此,假设进行了112场战斗,当前胜率为50%,要将这个胜率提高到70%,你需要连胜75场。
因此,在Swift中的简单解决方案是:
func additionalWins(currentRate: Double, targetRate: Double, battles: Int) -> Int {
let result = ((targetRate - currentRate) * Double(battles)) / (1 - targetRate)
return max(0, Int(result.rounded(.up)))
}
你可能应该检查前提条件并处理边缘情况,例如:
func additionalWins(currentRate: Double, targetRate: Double, battles: Int) -> Int {
precondition(0...1 ~= currentRate)
precondition(0...1 ~= targetRate)
precondition(battles >= 0)
if targetRate <= currentRate {
return 0
}
if battles == 0 {
return targetRate > 0 ? 1 : 0
}
if targetRate == 1 {
if currentRate == 1 {
return 0
}
fatalError("无论当前胜率为\(currentRate * 100)%,你都无法达到目标胜率\(targetRate * 100)%")
}
let result = ((targetRate - currentRate) * Double(battles)) / (1 - targetRate)
return max(0, Int(result.rounded(.up)))
}
顺便说一句,一种算法解决方案可能是:
func additionalWins(currentRate: Double, targetRate: Double, battles: Int) -> Int {
precondition(0...1 ~= currentRate)
precondition(0...1 ~= targetRate)
precondition(battles >= 0)
if targetRate <= currentRate {
return 0
}
if battles == 0 {
return targetRate > 0 ? 1 : 0
}
if targetRate == 1 {
if currentRate == 1 {
return 0
}
fatalError("无论当前胜率为\(currentRate * 100)%,你都无法达到目标胜率\(targetRate * 100)%")
}
var i = 0.0
var currentWins = (Double(battles) * currentRate).rounded()
var currentBattles = Double(battles)
while ((currentWins + i) / (currentBattles + i)) < targetRate {
i += 1
}
return Int(i)
}
但显然,算术解决方案更高效。
英文:
Defining a few variables:
- r<sub>t</sub> = target win rate
- r<sub>c</sub> = current win rate
- b<sub>c</sub> = how many battles thus far
- w<sub>a</sub> = how many additional wins are needed
Using a little algebra, we can deduce the solution:
> w<sub>a</sub> = ((r<sub>t</sub> - r<sub>c</sub>) ⨉ b<sub>c</sub>) / (1 - r<sub>t</sub>)
And, obviously, we then need to round that answer up to the nearest integer.
Thus, given 112 battles with a current run rate of 50%, to get that rate to 70% you’d need 75 straight wins.
Thus, the simple solution in Swift is:
func additionalWins(currentRate: Double, targetRate: Double, battles: Int) -> Int {
let result = ((targetRate - currentRate) * Double(battles)) / (1 - targetRate)
return max(0, Int(result.rounded(.up)))
}
You probably should check the preconditions and handle edge case scenarios, perhaps:
func additionalWins(currentRate: Double, targetRate: Double, battles: Int) -> Int {
precondition(0...1 ~= currentRate)
precondition(0...1 ~= targetRate)
precondition(battles >= 0)
if targetRate <= currentRate {
return 0
}
if battles == 0 {
return targetRate > 0 ? 1 : 0
}
if targetRate == 1 {
if currentRate == 1 {
return 0
}
fatalError("There is no way, given current rate of \(currentRate * 100)%, that you can achieve target rate of \(targetRate * 100)%")
}
let result = ((targetRate - currentRate) * Double(battles)) / (1 - targetRate)
return max(0, Int(result.rounded(.up)))
}
FWIW, an algorithmic solution might be:
func additionalWins(currentRate: Double, targetRate: Double, battles: Int) -> Int {
precondition(0...1 ~= currentRate)
precondition(0...1 ~= targetRate)
precondition(battles >= 0)
if targetRate <= currentRate {
return 0
}
if battles == 0 {
return targetRate > 0 ? 1 : 0
}
if targetRate == 1 {
if currentRate == 1 {
return 0
}
fatalError("There is no way, given current rate of \(currentRate * 100)%, that you can achieve target rate of \(targetRate * 100)%")
}
var i = 0.0
var currentWins = (Double(battles) * currentRate).rounded()
var currentBattles = Double(battles)
while ((currentWins + i) / (currentBattles + i)) < targetRate {
i += 1
}
return Int(i)
}
But the arithmetic solution is obviously more efficient.
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论