【问题标题】:Activate certain functions based on percent根据百分比激活某些功能
【发布时间】:2018-04-30 12:51:00
【问题描述】:
            if chance == 1:
                function1()

            elif chance == 4:
                function2()

            elif chance == 20:
                function3()

            elif chance == 10:
                functiongettingoutofideas()

            elif chance == 40:
               function_minecraft_club_was_not_on_today_insertcryingemoji()

            elif chance == 10:
               function8()

            elif chance == 4:
                functionthesearealotoffunctions()

            elif chance == 5:
                function_above_when_i_mean_5_i_mean_5_percent_chance()

            elif chance == 6:
                function_thank_you_for_your_help()

在 if 和 elifs 中,例如,机会 == 10,这意味着该功能有 10% 的机会被激活。

任何帮助都会非常感激

【问题讨论】:

  • chance 来自哪里?你的逻辑很难剖析。
  • 如果您能给我们举几个例子来说明 function1、function2、function3 等正在做什么,我们也许可以帮助您找到一种更好的方式来表达您想要做的事情,而无需使用这个 if/elif 链
  • 来自chance = random.randint(0,100)
  • 如果 chance == 4 会发生什么?您正在调用两种方法。可能你真正想要的是一系列机会,而不是具体的机会。嗯?
  • 不清楚您的问题是什么? 哪个函数的概率为 10%?

标签: python python-3.x function random percentage


【解决方案1】:

如果您选择一个介于 0-100 之间的随机数,并且希望某事发生的概率为 10%,您可以这样做:

if random < 10:
    doSomething()

doSomething 会出现在数字 0-10 上,但不会出现在数字 11-100 上,给你 10% 的机会。根据需要对其他函数/概率重复。

【讨论】:

  • 该代码有效,但我希望它根据机会激活不同的功能,例如 doSomething10() 有 10% 的机会被激活。
【解决方案2】:

三个函数的例子:

from numpy.random import choice
func_list = [function1, function2, function2]   
weights = [10,40, 50]
choice(func_list, 1, p=weights)()

请注意,要使其生效,weights 必须加起来为 100。

【讨论】:

  • 我收到一条错误消息ImportError: No module named numpy.random
  • 您使用的是 Spyder、Jupyter 还是其他?
  • @MasterHackerLOIS:如果您使用的是 Python 3.6 或更高版本,则不需要 NumPy。查看random.choices
  • @Accccumulation 当我运行你的代码时,一个错误提示没有定义选择,我只需要在程序的开头输入choice = 0吗?我使用 Atom IDE,但它不是很好。
  • @MasterHackerLOIS 当你导入一个模块时,它定义了一个模块。如果您的导入失败,那么当您尝试运行尝试使用该模块的东西时,它将引发另一个错误,因为它没有定义。你可以试试 Mark Dickinson 的不使用 numpy 的建议,或者弄清楚如何将 numpy 导入 Atom。
【解决方案3】:

这种方法只使用 Python 标准库。

首先将百分比转换为概率。

>>> p = [1, 4, 20, 10, 40, 10, 4, 5, 6]
>>> p = [0.01*_ for _ in p]

然后获得累积概率。只需执行一次这些预备。

>>> cum_probs = [0]
>>> for _ in p:
...     cum_probs.append(_ + cum_probs[-1])
...     
>>> cum_probs
[0, 0.01, 0.05, 0.25, 0.35, 0.75, 0.85, 0.89, 0.9400000000000001, 1.0]

>>> from random import random

从单位区间 [0, 1] 中随机选择。

>>> selection = random()

从左边开始,找到这个随机数所属的第一个概率区间,然后停止。

>>> for i, possibility in enumerate(cum_probs[1:]):
...     if selection < possibility:
...         print ('perform function number ', i)
...         break
...         
perform function number  3

这是要执行的函数的编号

这些行只是为了验证选择的随机数是否在要求的区间内。

>>> selection
0.33920981672706096

您可以将函数分配给数组中的区间。

>>> functions = [function_one, another_fn, my_function, ...]

更有可能的是,您会将它们放入字典中。 (我用的是你的名字。)

functions = {0: function1(); 1: function2(); ...}

然后你会这样调用想要的。

functions[i]

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-02-03
    • 2020-12-11
    • 2017-01-12
    • 1970-01-01
    • 1970-01-01
    • 2021-05-05
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多