从random.sample列表

时间:2017-08-16 09:45:32

标签: random attributes maya uniform

所以这就是我想要做的事情,而且我不确定我是如何成为python的新手。我已经搜索了一些选项,但我不确定为什么这样做不起作用。

所以我在maya中有6个不同的节点,称为aiSwitch。我需要生成从0到6的随机不同数字,并在aiSiwtch * .index中输入该值。

简而言之,结果应该是 aiSwitch1.index =(从0到5的随机数) aiSwitch2.index =(0到5之间的另一个随机数,与之前不同) unil aiSwitch6.index

等等

我尝试了以下内容:

import maya.cmds as mc
import random

allswtich = mc.ls('aiSwitch*')
    for i in allswitch:
    print i
    S = range(0,6)
    print S
    shuffle = random.sample(S, len(S))
    print shuffle
    for w in shuffle:
        print w
        mc.setAttr(i + '.index', w)

这是我从印刷品中得到的结果:

aiSwitch1 <-- from print i
[0,1,2,3,4,5] <--- from print S
[2,3,5,4,0,1] <--- from print Shuffle (random.sample results)
2
3
5
4
0
1  <--- from print w, every separated item in the random.sample list.

现在,每个aiSwitch都会发生这种情况,导致它处于循环中。并且随机数总是不同的列表,因为它在每次循环运行时都会发生。

那么问题出在哪里呢?

aiSwitch1.index = 1

所有其他的aiSwitch * .index总是只占用列表中的最后一项,但是我得到了setAttr的时间。似乎w保留了for循环的最后一个值。我不太明白如何

  1. 获取0到5之间的随机值

  2. 在aiSwitch1.index中输入该值

  3. 获取0到6之间的另一个随机值,与

  4. 之前的值不同
  5. 在aiSwitch2.index中输入该值

  6. 重复直到aiSwitch5.index。

  7. 我的确使用以下表格:

     allSwitch = mc.ls('aiSwitch')
     for i in allSwitch:
         mc.setAttr(i + '.index', random.uniform(0,5))
    

    这为所有aiSwitch * .index提供了从0到5的随机数,但其中一些重复。我认为这是有效的,因为每次循环运行时都会生成值,因此使用随机数设置属性。但数字重复,我试图避免这种情况。我也试过一次洗牌,却没能从中得到任何价值。

    我的主要错误似乎是我生成了一个列表并对其进行了抽样,但是我没有将该列表中的每个不同项目分配给不同的aiSwitch * .index节点。而且我已经没有这个想法了。

    任何线索都将不胜感激。 谢谢。 乔纳森。

1 个答案:

答案 0 :(得分:1)

这是一种有点Pythonic方式:将索引列表混洗,然后使用zip迭代它(这对于并行迭代结构非常有用,这是你需要在这里做的):

import random

index = list(range(6))
random.shuffle(index)

allSwitch = mc.ls('aiSwitch*')
for i,j in zip(allSwitch,index):
    mc.setAttr(i + '.index', j)