2017-04-04 150 views
3

相对较新的Python,所以任何可怕的编码道歉。在种子内生成随机数

我使用搅拌器使用树苗创建随机刺激集添加到创造这样enter image description here

我也想定义,我通过产生做平面上方的半球随机摄像头的位置和角度两个随机数字(在我的例子中,u和v)。

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

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

但是,对于这些生成的每个唯一树,随机数u和v总是相同的。这意味着对于我生成的每个随机树,摄像机角度是特定于该树(并且不是完全随机的)

我假设这是通过某种子发生的,所以我想知道是否有办法告诉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() 
+0

代码存在问题:您从'random'导入某些函数,但随后访问'random.uniform'。可以使用'import random'命名空间'random',或者从其中导入'uniform'函数,而不要用'random'作为前缀。 – trincot

+0

啊对不起!它从今天早上的一些修改代码。我一般只使用random()。 编辑示例中的代码以反映此 –

回答

3

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

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

其理由是:

由该模块提供的功能实际上是结合的random.Random类的隐藏的实例的方法。您可以实例化您自己的随机的情况下得到不共享状态发电机

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

+0

谢谢!这似乎是工作:) 如果我想创建多个随机数我可以重复使用相同的randomgen或将它们相关吗?例如如果我想为一个参数创建一个随机整数,为另一个参数创建一个随机高斯等,他们都会是相似的高/低数字? –

+1

你可以使用相同的randomgen,它会给你一个新的随机数。 randomgen将做同样的随机,除了它使用不同的种子。 –

0

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

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

让树变异的另一种方法是为幼树插件提供不同的种子。您可以在树形尺度上方的操作员调整面板中找到它,python API也接受种子参数。

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