たおピーの人生メモ

たおピーの人生をメモとして残しておく

ランダムな順列

今日は、1~Nの値を1回使ってできるランダムな順列をつくるアルゴリズムです。

ランダムな順列とは、たとえばNが5なら、[3、2、5、1、4]というような順列をつくることです。

さあ、やってみましょう。

 

【問題】

1~Nの値を1回使ってできるランダムな順列を作るには?

 【答え】

import random

N = 20

ret = []

ret.append(random.randint(1, N))

for i in range(2, N+1):

  while 1:

    r = random.randint(1, N)

    if r not in ret:

      break

    ret.append(r)

print ret

 

【実行結果】
[2, 8, 3, 16, 17, 15, 19, 10, 11, 18, 12, 4, 5, 6, 1, 14, 7, 20, 9, 13]

しかし、上記のアルゴリズムだと、繰り返し回数が最悪でNの2乗となってしまうので
効率が悪いらしい。

そこで、繰り返し回数が2Nになる効率のよいアルゴリズムが以下だ。

 

【答え】

import random

N = 20

ret = range(1, N+1)

for i in range(N-1, 0, -1):

  j = random.randint(0, i)

  ret[i], ret[j] = ret[j], ret[i]

print ret

 

【実行結果】
[2, 8, 3, 16, 17, 15, 19, 10, 11, 18, 12, 4, 5, 6, 1, 14, 7, 20, 9, 13]

確かに、実行スピードの効率はよさそうだけど、メモリは下のほうが食うかな。