首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >快速增加随机数概率

快速增加随机数概率
EN

Stack Overflow用户
提问于 2016-03-08 10:42:57
回答 2查看 724关注 0票数 0

我试着做一个游戏,英雄的伤害是在一个范围内随机产生的,但是英雄的运气越大,英雄在这个范围内使用最大伤害数的几率就越高。

我用了双分机来让我自己更容易。

代码语言:javascript
复制
public extension Double {

  public static func random(lower: Double = 0, _ upper: Double = 100) -> Double {

    return (Double(arc4random()) / 0xFFFFFFFF) * (upper - lower) + lower

}

//Assigning the random number to a constant
let heroDamage = Double.random(5, 15)

假设英雄现在有80%的概率得到最大伤害(在本例中为15),我将如何处理这个?,谢谢提前。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2016-03-08 11:26:10

对于给定的pMaxDamage (例如,pMaxDamage = 0.80)的最大损坏概率,一个简单的解决方案是在[0,1]和output中生成一个随机数,例如r

  • maxDamage如果r <= pMaxDamage
  • 否则是[minDamage, maxDamage]范围内的随机伤害。

例如:

代码语言:javascript
复制
class Hero {
    let heroName: String
    let pMaxDamage: Double // probability to generate max damage

    init(heroName: String, pMaxDamage: Double) {
        self.heroName = heroName
        self.pMaxDamage = pMaxDamage
    }

    func generateDamage(minDamage minDamage: Double, maxDamage: Double) -> Double {
        let r = (Double(arc4random()) / 0xFFFFFFFF)

        return r <= pMaxDamage ? maxDamage
            : round(100*((r-pMaxDamage)/(1-pMaxDamage)*(minDamage-maxDamage)+maxDamage))/100
    }
}

对于上述实现,r-damage ([0, 1]中的r统一随机数)响应曲线如下所示:

示例用法:

代码语言:javascript
复制
let myHero = Hero(heroName: "Foo", pMaxDamage: 0.80)
for _ in (1...10) {
    print("Slash! <\(myHero.generateDamage(minDamage: 5, maxDamage: 15)) damage>")
}

示例输出:

代码语言:javascript
复制
Slash! <15.0 damage>
Slash! <12.68 damage>
Slash! <15.0 damage>
Slash! <15.0 damage>
Slash! <5.72 damage>
Slash! <15.0 damage>
Slash! <15.0 damage>
Slash! <15.0 damage>
Slash! <15.0 damage>
Slash! <15.0 damage>

如果您希望您的伤害值仅取整数值,则另一种解决方案是使用轮盘赌轮选择

  • pMaxDamage选择maxDamage的概率,
  • 选择任何剩余的(1-pMaxDamage)/(numDamagePoints-1)损伤值的均匀{minDamage, minDamage+1, ..., maxDamage-1}概率。
票数 2
EN

Stack Overflow用户

发布于 2016-03-08 11:12:59

或许能给随机函数增加点运气?这里的纯线性实现。不过,你可以用一些高级曲线。

代码语言:javascript
复制
private let MaxLuck = 1000.0
public extension Double {
    public static func random(lower: Double = 0, _ upper: Double = 100, luck: Double) -> Double {
        let weight = min(luck / MaxLuck, 1)
        return (Double(arc4random()) / 0xFFFFFFFF) * weight * (upper - lower) + lower
    }
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/35865201

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档