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

```