增加随机数概率swift

时间:2016-03-08 10:42:58

标签: swift probability arc4random

我正在尝试制作一个游戏,其中英雄伤害是在一个范围内随机生成的,但是英雄拥有的运气越多,英雄在该范围内使用最大伤害数命中的概率就越高。

我正在使用Double扩展程序让自己更轻松。

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),我该如何处理?,提前谢谢。

2 个答案:

答案 0 :(得分:1)

也许为随机函数添加运气?这里纯线性实现。你可以使用一些高级曲线。

<div class="wrap">
  <div class="inner"><h1>1</h1>blubby blubby bluuu</div>
  <div class="inner"><h1>2</h1>blubby blubby bluuu</div>
  <div class="inner"><h1>3</h1>blubby blubby bluuu</div>
  <div class="inner"><h1>4</h1>blubby blubby bluuublubby blubby bluuu</div>
  <div class="inner"><h1>5</h1>blubby blubby bluuu</div>
  <div class="inner"><h1>6</h1>blubby blubby bluuublubby blubby bluuu</div>
  <div class="inner"><h1>7</h1>blubby blubby bluuu</div>
  <div class="inner"><h1>8</h1>blubby blubby bluuu</div>
  <div class="inner"><h1>9</h1>blubby blubby bluuu</div>
  <div class="inner"><h1>10</h1>blubby blubby bluuu</div>
  <div class="inner"><h1>11</h1>blubby blubby bluuu</div>
  <div class="inner"><h1>12</h1>blubby blubby bluuu</div>
</div>

答案 1 :(得分:1)

对于pMaxDamage(例如pMaxDamage = 0.80)的给定最大伤害概率,一个简单的解决方案是在r中生成一个随机数,比如[0,1]并输出:

  • maxDamage if r <= pMaxDamage
  • 范围[minDamage, maxDamage]中的随机伤害,否则。

E.g:

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-damager响应曲线中的[0, 1]统一随机数)如下所示:

enter image description here

使用示例:

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

示例输出:

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}伤害值的概率。
相关问题