Search code examples
randomattributesmayauniform

Input to different attributes values from a random.sample list


so this is what I'm trying to do, and I'm not sure how cause I'm new to python. I've searched for a few options and I'm not sure why this doesn't work.

So I have 6 different nodes, in maya, called aiSwitch. I need to generate random different numbers from 0 to 6 and input that value in the aiSiwtch*.index.

In short the result should be aiSwitch1.index = (random number from 0 to 5) aiSwitch2.index = (another random number from 0 to 5 different than the one before) And so on unil aiSwitch6.index

I tried the following:

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)

This is the result I get from the prints:

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.

Now, this happens for every aiSwitch, cause it's in a loop of course. And the random numbers are always a different list cause it happens every time the loop runs.

So where is the problem then?

aiSwitch1.index = 1

And all the other aiSwitch*.index always take only the last item in the list but the time I get to do the setAttr. It seems to be that w is retaining the last value of the for loop. I don't quite understand how to

  1. Get a random value from 0 to 5

  2. Input that value in aiSwitch1.index

  3. Get another random value from 0 to 6 different to the one before

  4. Input that value in aiSwitch2.index

  5. Repeat until aiSwitch5.index.

I did get it to work with the following form:

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

This gave a random number from 0 to 5 to all aiSwitch*.index, but some of them repeat. I think this works cause the value is being generated every time the loop runs, hence setting the attribute with a random number. But the numbers repeat and I was trying to avoid that. I also tried a shuffle but failed to get any values from it.

My main mistake seems to be that I'm generating a list and sampling it, but I'm failing to assign every different item from that list to different aiSwitch*.index nodes. And I'm running out of ideas for this.

Any clues would be greatly appreciated. Thanks. Jonathan.


Solution

  • Here is a somewhat Pythonic way: shuffle the list of indices, then iterate over it using zip (which is useful for iterating over structures in parallel, which is what you need to do here):

    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)