# [Edu-sig] Cryptonomicon

**Dustin Mitchell
**
dustin@cs.uchicago.edu

*Sun, 19 Nov 2000 22:38:50 -0600 (CST)*

On Sun, 19 Nov 2000, Daniel Yoo wrote:
>* This looks nice! It might be nice to show another approach to shuffling
*>* the alphabet:
*>*
*>* ###
*>* from string import uppercase
*>* from random import randint
*>* def permute(L):
*>* """
*>* Permute a list by swapping elements randomly.
*>* """
*>* newlist = L[:] # shallow copy
*>* for i in range(len(L)):
*>* rand_i = randint(i, len(L)-1)
*>* newlist[i], newlist[rand_i] = newlist[rand_i], newlist[i]
*>* return newlist
*>*
*>* if __name__ == '__main__':
*>* print permute(list(uppercase))
*>* ###
*
It takes a bit more thought to see that this acheives the same amount of
permutation as the original. For instance, if we merely swapped random
elements L times, the result would be different, because unchanged
elements would be much more common. That is:
###
from string import uppercase
from random import randint
def permute(L):
"""
Permute a list by swapping elements randomly.
"""
newlist = L[:] # shallow copy
for i in range(len(L)/2+1):
rand_i = randint(0, len(L)-1)
rand_j = randint(0, len(L)-1)
newlist[rand_j], newlist[rand_i] = newlist[rand_i], newlist[rand_j]
return newlist
if __name__ == '__main__':
print permute(list(uppercase))
###
I can see some interesting discussions about what it means to be random,
and what sorts of characteristics we might want from a 'random' activity
in different situations.
---------------------------------------------------------------------
|* Connection - in an isolating age )O( |
*---------------------------------------------------------------------