增加随机数概率swift
Increase random number probability swift
我正在尝试制作一个英雄伤害在一个范围内随机产生的游戏,但英雄的运气越多,英雄在该范围内以最大伤害数命中的概率就越高。
我正在使用 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),我将如何处理?提前致谢。
也许给随机函数加点运气?这里是纯线性实现。不过,您可以使用一些高级曲线。
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
}
}
对于给定的最大伤害概率 pMaxDamage
(比如 pMaxDamage = 0.80
),一个简单的解决方案是在 [0,1]
中生成一个随机数,比如 r
和输出:
maxDamage
如果 r <= pMaxDamage
,
[minDamage, maxDamage]
范围内的随机伤害,否则。
例如:
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
均匀随机数)响应曲线如下所示:
用法示例:
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}
伤害值的概率。
我正在尝试制作一个英雄伤害在一个范围内随机产生的游戏,但英雄的运气越多,英雄在该范围内以最大伤害数命中的概率就越高。
我正在使用 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),我将如何处理?提前致谢。
也许给随机函数加点运气?这里是纯线性实现。不过,您可以使用一些高级曲线。
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
}
}
对于给定的最大伤害概率 pMaxDamage
(比如 pMaxDamage = 0.80
),一个简单的解决方案是在 [0,1]
中生成一个随机数,比如 r
和输出:
maxDamage
如果r <= pMaxDamage
,[minDamage, maxDamage]
范围内的随机伤害,否则。
例如:
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
均匀随机数)响应曲线如下所示:
用法示例:
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}
伤害值的概率。