2017-04-04 148 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)