概率范围内随机整数(Python)

2024-03-29 06:55:56 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在制作一个基于文本的RPG。我有一个算法,它可以根据两个变量的值来确定玩家对敌人造成的伤害。我还不确定算法的第一部分将如何工作,但这并不重要。在

AttackStrength是玩家的一个属性,通常表示他的攻击有多强。WeaponStrength是玩家所持剑的一个属性,通常表示该武器的攻击强度

以下是算法的运行方式:

import random
Damage = AttackStrength (Do some math operation to WeaponStrength) WeaponStrength
DamageDealt = randrange(DamageDealt - 4, DamageDealt + 1) #Bad pseudocode, sorry

我想对最后一行做的是在一个整数范围内得到一个随机整数,最小界值比损伤小4,最大界值比损伤多1。但是,还不止这些。我想分配的概率是:

  • X%的时间造成的伤害等于伤害
  • Y%的时间造成的伤害将等于比伤害少1
  • Z%的时间造成的伤害将等于比伤害少2
  • 造成伤害的时间百分比等于伤害的3%
  • B%的时间造成的伤害将等于比伤害少3
  • 造成伤害的时间比伤害多1%

我希望我没有把这一切复杂化谢谢你!在


Tags: 文本算法属性方式时间玩家整数rpg
3条回答

我认为当你有很好的整数概率时,做随机加权概率的最简单的方法就是简单地用你选择的多个副本填充一个列表-以正确的比率-然后从中随机选择一个元素。在

让我们从-3到1,你的(原始)权重为10,10,25,25,30%。它们的gcd为5,因此您只需要一个长度为20的列表来保存您的选择:

choices = [-3]*2 + [-2]*2 + [-1]*5 + [0]*5 + [1]*6

实现完成后,从中随机选择。演示显示100次试验:

^{pr2}$

基本上,你要完成的是模拟一个加载的模具:你有六种可能性,并希望为每一种可能性分配不同的概率。从数学上讲,这是一个相当有趣的问题,here是关于这个主题的一篇精彩文章。在

不过,您可能正在寻找一些不太冗长的东西,在这里实现的最简单的模式是通过轮盘赌选择。给定一个字典,其中键是各种“边”(在本例中是可能的损伤公式),值是每边发生的概率(.3, .25),方法如下所示:

def weighted_random_choice(choices):
    max = sum(choices.values())
    pick = random.uniform(0, max)
    current = 0
    for key, value in choices.items():
        current += value
        if current > pick:
            return key

假设我们希望对结果有这些相对权重:

a = (10, 15, 15, 25, 25, 30)

然后我们创建一个部分和列表b和一个函数c

^{pr2}$

函数c将返回一个从0到{}的整数,概率与a中指定的权重成比例。在

相关问题 更多 >