[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( |
---------------------------------------------------------------------