ランダム・シャッフル
Upcoming SlideShare
Loading in...5
×
 

ランダム・シャッフル

on

  • 591 views

Japaneser version only

Japaneser version only

Statistics

Views

Total Views
591
Views on SlideShare
591
Embed Views
0

Actions

Likes
0
Downloads
0
Comments
0

0 Embeds 0

No embeds

Accessibility

Categories

Upload Details

Uploaded via as Adobe PDF

Usage Rights

© All Rights Reserved

Report content

Flagged as inappropriate Flag as inappropriate
Flag as inappropriate

Select your reason for flagging this presentation as inappropriate.

Cancel
  • Full Name Full Name Comment goes here.
    Are you sure you want to
    Your message goes here
    Processing…
Post Comment
Edit your comment

    ランダム・シャッフル ランダム・シャッフル Presentation Transcript

    • ランダム・シャッフル まるやま 2013/04/18 1/5
    • 問題 1から10までの値が、順番に配列に入っている これをランダムに並べ替えたい こんなことが必要なこともあるよね さて、どうすればよいか 2/5
    • 考え方 配列の並べ替えなので、結局は配列要素をスワップする {どうやって|何回}並べ替えるのかが、考えるポイント 配列の取り得るパターン数は、順列数え上げなので、 N 個の配列だとすると N PN = N! 個 irandom(i,j) という関数は、 i 以上 j 以下のランダムな整数を返すものとする iramdom(1,N) を行って、1 以上 N 以下の値 r 1 を得る 最初は配列要素の位置と値が同じはずなので、 1番目の要素と r 1 番目の要素を入れ替えることによって、 1番目の要素をランダムな値にする 1番目の要素が選ばれるパターンは、N 通り irandom(2,N) を行って、2 以上 N 以下の値 r 2 を得る 2番目の要素と r 2 番目の要素を入れ替えることによって、 2番目の要素を(1番目の値以外の)ランダムな値にする 2番目の要素が選ばれるパターンは、N − 1 通り 3/5
    • 考え方(続き) このやり方を N − 1 回繰り返す N − 1 回目は、irandom(N-1,N) なので、 N − 1 番目と N 番目を入れ替えるか否かの2択 N 回目は、もうひとつしか残っていないので、やる必要なし すると、ランダムに選んだ方法のパターン数も、N! 通り 配列のパターン数と同じだけ、ランダムに並べ替えられる 4/5
    • Lua で実装 Lua で実装してみる random shuffle.lua num = 10 math.randomseed(os.time()) a = {} for i = 1, num, 1 do a[i] = i end for i = 1, num - 1, 1 do r = math.random(i, num) if (i < r) then a[i], a[r] = a[r], a[i] end end for i = 1, num, 1 do print(a[i]) end Lua にはお誂え向きの random も swap もある! ほとんどワンライナーじゃないか! 5/5