TOMBOLA!! randomize text waves, excellent to choose the presenter or make a cookies list for lab meetings

I accidantally deleted the following code snipped posted July 5th, 2012 by purozongo. Fortunately, Adam Light found it in Google's cache, so here is it again:
//      ***TOMBOLA!!!***
// TOMBOLA!!! randomize the text wave "lista" in the wave "resultado"
// excelent to choose the presenter or cookies list for the lab seminars
// Germán Fernández, <a href="mailto:gfernandez@uchile.cl&quot; rel="nofollow">gfernandez@uchile.cl</a>, @2012
 
Function Tombola(lista)
Wave/T lista
variable i,j,k
string comp
Make/T/O/N=(numpnts(lista)) resultado=""
 
do
    j=round(abs((enoise( (numpnts(lista) -1) ) ) ) )
    comp=lista[j]
    k=check(resultado,comp)
        if (k==1)
        resultado[i]=comp
        i+=1
        endif
while (i<(numpnts(lista)))
 
end
 
Function check(onda,busca)
wave onda
string busca
 
FindValue/S=0 /TEXT=busca/TXOP=1  onda
if (V_value==(-1))
    return 1
else
    return 0
endif
end




s.r.chinn's reply was also gone:

Here is an alternate approach that can be modified to randomize the order of ANY type of wave. The idea is to use a randomized index permutation wave as a sort key. No string comparisons are necessary. As above, a new re-ordered wave is created, but the input could also be re-ordered in place.

function SortNames(inList)  // re-orders input text wave by randomized sort key
    wave/T inList
    variable Npts = numPnts(inList)
 
    string outName = NameofWave(inList)+"_R"
    Duplicate/O inList, $outName    //  make new wave for re-ordered list
    WAVE outList = $outName
 
    shuffle(Npts)       //  create random sort key
    WAVE wPerm
    IndexSort wPerm, outList    //  re-arrange the output list entries
end
 
function shuffle(Npts)  //  perform a random permutation of indices 0...Npts-1
    variable Npts
    make/O/N=(Npts) wPerm = p   //  will be used as sort key
    variable i, j, temp
    for(i=Npts-1; i>0; i-=1)
        temp = wPerm[i]
        j = round(  i/2+enoise(i/2)  ) // pick random index from remaining choices
        wPerm[i] = wPerm[j] //  swap entries
        wPerm[j] = temp
    endfor
end



For information on random shuffling, see http://en.wikipedia.org/wiki/Knuth_shuffle.


And here is what I actually wanted to add as another approach:

make/n=(numpnts(lista))/o keyw=abs(enoise(1))
duplicate/o lista resultado
sort keyw resultado


A
The method by awirsing is very concise and elegant. It should usually work.

I hate to be too picky, but in theory doesn't assigning any random values to elements of keyw allow for duplication of values? Extremely unlikely, but theoretically possible. How random is the sorting then if keyw may have some equal values?

My method constrains the random choices among remaining sort indices, not permitting index duplication.
Hi, thanks for repost my code.
s.r.chinn, i found very interesting your comment, if well this sniplet was writen just as a need of some method to sort our lab meetings could be a good method to "random sort" of text waves.

thanks for your comments.
Germán.

Forum

Support

Gallery

Igor Pro 9

Learn More

Igor XOP Toolkit

Learn More

Igor NIDAQ Tools MX

Learn More