【问题标题】:Generate Random Numbers Within A Seed在种子中生成随机数
【发布时间】:2017-08-29 08:07:12
【问题描述】:

对 python 来说相对较新,因此对任何糟糕的编码表示歉意。

我正在使用搅拌机创建随机刺激集,使用树苗插件创建类似

我还想在平面上方的半球中定义一个随机的相机位置和角度,我通过生成两个随机数(在下面的示例中为 u 和 v)来实现。

但是,调用 py.ops.curve.tree_add 函数(生成树)会设置某种种子,这意味着我生成的随机数总是相同的。

例如在示例代码中,它根据为 basesize/basesplit 生成的 randint() 创建一系列不同的树。

但是,对于这些生成的每棵唯一树,随机数 u 和 v 始终相同。这意味着对于我生成的每棵随机树,相机角度都是特定于该树的(而不是完全随机的)

我假设这是通过一些种子发生的,所以我想知道是否有办法告诉 python 生成一个随机数并忽略任何种子?

最好的,

示例代码:(import bpy是blender的python api模块)

### libraries
import bpy
from random import random, randint

u = random()
v = random()
obj = bpy.ops.curve.tree_add(bevel = True,
                                prune = True,
                                showLeaves = True,
                                baseSize = randint(1,10)/10,
                                baseSplits = randint(0,4))
print(u)
print(v)

如果有帮助,我生成一个球体以放置相机然后将其指向对象的功能是(为简洁起见,我没有在此处包含库/脚本的其余部分等 - 它在周围创建了一个点一个半径为 r 的已定义中心,与上述问题不同):

#generate the position of the new camera
def randomSpherePoint(sphere_centre, r, u, v):
    theta = 2 * pi * u
    phi = acos(2 * v - 1)
    x = centre[0] + (r * sin(phi) * cos(theta))
    y = centre[1] + (r * sin(phi) * sin(theta))
    z = fabs(centre[2] + (r * cos(phi)))
    return(x,y,z)

hemisphere_point = randomSpherePoint(centre, radius, u, v)
print(hemisphere_point)
#add a camera at this randomly generated hemispheric location
bpy.ops.object.camera_add(location = hemisphere_point)
the_camera = bpy.data.objects["Camera"]
#rotate the camera to the centre of the plane
camera_direction = centre - camera_location
camera_rotation = camera_direction.to_track_quat('-Z', 'Y')
the_camera.rotation_euler = camera_rotation.to_euler()

【问题讨论】:

  • 代码有问题:你从random导入某些函数,然后访问random.uniform。要么使用import random 获取命名空间random,要么从中导入uniform 函数,并且不要以random 为前缀。
  • 啊抱歉!它来自今天早上对代码的一些修改。我通常只是在使用随机()。编辑示例中的代码以反映这一点
  • 您是否拥有可通过 Python 调用而不是使用菜单和预设的完整树苗?谢谢!

标签: python random blender seed


【解决方案1】:

您可以使用 random.Random 类创建一个随机实例。 一个例子是:

randomgen = random.Random()
randomgen.uniform(0,1)

这个原因是:

此模块提供的函数实际上是 random.Random 类的隐藏实例的绑定方法。你可以实例化你自己的 Random 实例来获取不共享状态的生成器

(来自https://docs.python.org/3/library/random.html

【讨论】:

  • 谢谢!这似乎有效:) 如果我想创建多个随机数,我可以重复使用相同的 randomgen 还是它们会相关?例如如果我想为一个参数创建一个随机整数,为另一个参数创建一个随机高斯等等。它们都是类似的高/低数字吗?
  • 你可以使用同一个randomgen,它会给你一个新的随机数。 randomgen 的作用与 random 相同,只是它使用不同的种子。
【解决方案2】:

Python 的random module 提供了seed() 方法供您设置种子。

import random
random.seed(12)
random.randint(0,100)

另一个让你的树发生变化的选择是为树苗插件提供不同的种子。你可以在树比例上方的操作员调整面板中找到它,python API 也接受一个种子参数。

bpy.ops.curve.tree_add(seed=myseed)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-02-16
    • 2014-09-20
    • 1970-01-01
    • 2021-05-15
    • 1970-01-01
    • 2013-08-23
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多