英文:
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.
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。


评论