首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >有效的“命运结”部分遗传函数

有效的“命运结”部分遗传函数
EN

Stack Overflow用户
提问于 2021-05-05 15:35:35
回答 1查看 30关注 0票数 0

在精灵游戏(从第六代起),命运结是一个项目,当持有,将导致父母传递它的一些统计数字给任何孩子,它可能有。

我希望在python 3中创建一个函数,它将创建一个数字列表的副本,该列表部分是随机生成的,部分是从“父”继承的。以下是我的第一个实现:

代码语言:javascript
运行
复制
def destiny_knot(parent, prob):
    child = []
    for n in parent :
        if np.random.rand(1)<prob :
            child.append(n)
        else :
            child.append(np.random.normal())
    return child

当运行时,它的工作原理是:

代码语言:javascript
运行
复制
foo = range(10)
destiny_knot(foo, 0.5)

[3.7189086135642975, 1, 0.6303126955135048, -0.9230447017112412, 4, 5, 6, 0.8633075878923896, 0.4633879779484653, -1.5192557497361636]

但是,对我来说很明显,这需要很长的时间才能真正实现我正在寻找的用途:我的每个列表都是数千个元素,如果不是几十万元素的话,我的目标是生成数千个元素。

我在考虑确定一些将被继承的元素,生成N减去那么多随机数,但我也需要在正确的位置继承它们,这给整个问题增加了一层复杂性。

做这件事最有效的方法是什么?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-05-05 15:40:45

由于您使用的是NumPy:

代码语言:javascript
运行
复制
def destiny_knot(parent: np.ndarray, prob: float):
    child = parent.copy() # Inherit everything
    # Mask for future random numbers
    am_I_random = np.random.rand(parent.size) > prob
    # Generate random numbers and put them into `child`
    # according to the mask `am_I_random`
    child[am_I_random] = np.random.normal(size=am_I_random.sum())

    return child

确保parent是一个浮点数数组,否则np.random.normal(size=am_I_random.sum())返回的浮点数将转换为整数或任何类型的parent

示例运行:

代码语言:javascript
运行
复制
>>> parent = np.asfarray([1,2,3,6,4,2,5])
>>> destiny_knot(parent, .7)
array([ 1.        ,  2.        ,  3.        ,  6.        , -1.10456035,
        2.        ,  2.43449116])
>>> destiny_knot(parent, .5)
array([-0.67617249,  2.        ,  3.        , -2.11637063,  0.19032201,
        2.        ,  5.        ])
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/67404404

复制
相关文章

相似问题

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