完全なシャッフル

当カテゴリー 初めてのプログラミング に投稿す度、常々其の有用性を賛美するに吝かならぬが、 Ruby及びプログラミングの両者が目的に共に入門書としてお誂え向きとて愛読の 初めてのプログラミング も今度は少し許り様相の異なるが訳はアーティクル後半に譲るとして、 各章末に設えられたる練習問題に正解の掲載されぬが心許無さを、 本誌と共に共有、ご愛読の同志に捧ぐ、 当ブログに於いては参照、比較検討用に贄とて供す個人的な解釈、解答を掲載すべきが、 本カテゴリーに於いて前回に当たる2009年3月21日のアーティクル 再帰プログラム入門 にて本格的プログラマーの皆様ようこそ、との著者の激励を受け乍、 愈々入りたるは第10章
10章 再帰とこれまでの復習
10.1 再帰
10.2 通過儀礼:並べ替え(ソート)
10.3 練習問題
10.4 例をもう1つ
10.5 追加練習問題
にて、無事イニシエーションを潜り抜けて立ち向かうが今回の 10.3に項目立てらる練習問題を引用すれば、
配列を取ってそれを完全にシャッフルして返す、 shuffleというメソッドを書いて下さい。
とあり、此れを章意に沿って、 再帰を用いて作成するを今回は当方解答例として供すべく積りにてあります。
スポンサーリンク
上記を受け、先ず書いて見たものが下記になります。
class Array

  def sort
    # このメソッドは「recursive_sort」をラップする。
    # ´[]´を引数に渡すのを防ぐ為
    shuffle_sort self, []
  end

  # シャッフル・ソート・メソッド

  def shuffle_sort unsorted_array, sorted_array
    shuffle = ´´ #ランダム抽出単語
    tmp_sorted_array = [] #一時保存用配列

    randam_num = rand(unsorted_array.size)

    if unsorted_array.size > 1
      i = 0
      unsorted_array.size.times do
        if i == randam_num
          shuffle = unsorted_array[i]
        else
          tmp_sorted_array.push unsorted_array[i]
        end
        i += 1
      end
    else
      shuffle = unsorted_array[0]
    end

    sorted_array.push shuffle

    if unsorted_array.size > 1
      #再帰
      shuffle_sort(tmp_sorted_array, sorted_array)
    else
      puts sorted_array.join(´, ´)
    end
  end

end

# ユーザー入力取得ブロック

word = []

while word.last != ´´
  puts ´シャッフルしたい単語を入力!´
  puts ´結果閲覧:無入力=>ENTER押下´
  word.push gets.chomp
end
word.pop


# シャッフルソート及び結果表示ブロック

word.sort
上記プログラムを、現在と云えども最早二年前のものとなる手元Windows環境
ruby 1.8.6 (2007-03-13 patchlevel 0) [i386-mswin32]
で走らせて得られる結果は、 orange、kiwi、banana、apple、pineapple、peach の順に単語を入力すれば、
C:¥tsukamotch¥Ruby¥programs>shuffle.rb
シャッフルしたい単語を入力!
結果閲覧:無入力=>ENTER押下
orange
シャッフルしたい単語を入力!
結果閲覧:無入力=>ENTER押下
kiwi
シャッフルしたい単語を入力!
結果閲覧:無入力=>ENTER押下
banana
シャッフルしたい単語を入力!
結果閲覧:無入力=>ENTER押下
apple
シャッフルしたい単語を入力!
結果閲覧:無入力=>ENTER押下
pineapple
シャッフルしたい単語を入力!
結果閲覧:無入力=>ENTER押下
peach
シャッフルしたい単語を入力!
結果閲覧:無入力=>ENTER押下

orange, kiwi, peach, banana, pineapple, apple
との結果が得られるが一回目、 扠、二回目は同様にして、実施して列挙すば以下、
  1. orange, kiwi, peach, banana, pineapple, apple
  2. peach, orange, banana, apple, pineapple, kiwi
  3. peach, apple, orange, banana, kiwi, pineapple
  4. pineapple, peach, banana, orange, apple, kiwi
  5. peach, kiwi, apple, banana, orange, pineapple
  6. peach, pineapple, apple, banana, kiwi, orange
  7. kiwi, pineapple, banana, apple, orange, peach
となるを、此処まで順次実行するに此の手間はたまらんと、 上記プログラムを少々変更するに、2008年12月21日アーティクルは 初めてのプログラミング5(イテレータ) にあるイテレータを利用して100回、当該シャッフルメソッドに処理させ、 出力されたが以下になります。
  1. apple, peach, kiwi, banana, orange, pineapple
  2. kiwi, banana, orange, pineapple, peach, apple
  3. banana, pineapple, orange, apple, peach, kiwi
  4. kiwi, banana, orange, apple, pineapple, peach
  5. banana, pineapple, kiwi, orange, peach, apple
  6. kiwi, orange, peach, banana, apple, pineapple
  7. apple, banana, pineapple, kiwi, peach, orange
  8. peach, apple, orange, pineapple, banana, kiwi
  9. peach, pineapple, orange, apple, kiwi, banana
  10. orange, apple, kiwi, banana, peach, pineapple
  11. apple, pineapple, kiwi, orange, peach, banana
  12. apple, kiwi, banana, pineapple, peach, orange
  13. banana, peach, pineapple, kiwi, apple, orange
  14. pineapple, peach, kiwi, apple, banana, orange
  15. apple, banana, kiwi, pineapple, peach, orange
  16. banana, kiwi, orange, pineapple, apple, peach
  17. orange, peach, kiwi, banana, pineapple, apple
  18. banana, orange, peach, apple, pineapple, kiwi
  19. orange, banana, peach, apple, kiwi, pineapple
  20. kiwi, peach, apple, pineapple, banana, orange
  21. kiwi, pineapple, peach, banana, orange, apple
  22. peach, banana, orange, pineapple, apple, kiwi
  23. peach, apple, banana, pineapple, kiwi, orange
  24. orange, banana, apple, kiwi, pineapple, peach
  25. banana, orange, pineapple, apple, kiwi, peach
  26. pineapple, kiwi, apple, orange, banana, peach
  27. orange, peach, apple, banana, pineapple, kiwi
  28. banana, peach, orange, apple, kiwi, pineapple
  29. kiwi, apple, orange, peach, banana, pineapple
  30. apple, peach, orange, kiwi, banana, pineapple
  31. banana, kiwi, apple, peach, pineapple, orange
  32. banana, peach, apple, orange, kiwi, pineapple
  33. peach, banana, apple, orange, pineapple, kiwi
  34. peach, orange, banana, apple, kiwi, pineapple
  35. pineapple, banana, kiwi, peach, orange, apple
  36. orange, banana, apple, peach, pineapple, kiwi
  37. banana, apple, peach, orange, pineapple, kiwi
  38. apple, peach, orange, kiwi, banana, pineapple
  39. apple, pineapple, orange, kiwi, banana, peach
  40. peach, apple, pineapple, orange, kiwi, banana
  41. kiwi, orange, peach, pineapple, banana, apple
  42. peach, pineapple, banana, apple, kiwi, orange
  43. pineapple, peach, orange, banana, kiwi, apple
  44. kiwi, orange, banana, peach, apple, pineapple
  45. peach, apple, banana, kiwi, pineapple, orange
  46. kiwi, pineapple, peach, apple, orange, banana
  47. banana, apple, pineapple, peach, orange, kiwi
  48. apple, banana, kiwi, peach, pineapple, orange
  49. orange, peach, apple, banana, pineapple, kiwi
  50. peach, apple, kiwi, pineapple, banana, orange
  51. orange, kiwi, banana, pineapple, apple, peach
  52. banana, pineapple, kiwi, orange, peach, apple
  53. orange, kiwi, banana, apple, peach, pineapple
  54. pineapple, banana, kiwi, apple, orange, peach
  55. orange, apple, kiwi, pineapple, peach, banana
  56. peach, pineapple, kiwi, orange, banana, apple
  57. apple, peach, orange, banana, pineapple, kiwi
  58. peach, banana, apple, pineapple, kiwi, orange
  59. peach, kiwi, pineapple, orange, apple, banana
  60. orange, peach, apple, kiwi, banana, pineapple
  61. apple, kiwi, orange, peach, banana, pineapple
  62. apple, kiwi, banana, peach, pineapple, orange
  63. peach, kiwi, banana, orange, apple, pineapple
  64. pineapple, kiwi, orange, peach, banana, apple
  65. peach, kiwi, apple, pineapple, orange, banana
  66. orange, kiwi, pineapple, apple, banana, peach
  67. pineapple, peach, kiwi, banana, orange, apple
  68. banana, apple, kiwi, peach, pineapple, orange
  69. apple, orange, pineapple, kiwi, peach, banana
  70. apple, orange, kiwi, banana, pineapple, peach
  71. banana, orange, pineapple, peach, apple, kiwi
  72. orange, banana, apple, pineapple, kiwi, peach
  73. peach, banana, orange, pineapple, kiwi, apple
  74. orange, pineapple, peach, kiwi, apple, banana
  75. apple, kiwi, pineapple, peach, banana, orange
  76. pineapple, banana, orange, peach, kiwi, apple
  77. peach, banana, pineapple, kiwi, apple, orange
  78. apple, peach, kiwi, banana, orange, pineapple
  79. kiwi, peach, pineapple, banana, apple, orange
  80. apple, peach, orange, kiwi, banana, pineapple
  81. orange, apple, pineapple, kiwi, banana, peach
  82. banana, peach, pineapple, kiwi, orange, apple
  83. kiwi, peach, orange, banana, pineapple, apple
  84. kiwi, banana, pineapple, orange, peach, apple
  85. orange, kiwi, apple, banana, peach, pineapple
  86. pineapple, peach, orange, kiwi, apple, banana
  87. peach, orange, banana, pineapple, kiwi, apple
  88. banana, pineapple, peach, apple, kiwi, orange
  89. orange, kiwi, pineapple, banana, apple, peach
  90. pineapple, kiwi, peach, orange, banana, apple
  91. pineapple, orange, peach, banana, apple, kiwi
  92. pineapple, apple, orange, kiwi, banana, peach
  93. kiwi, apple, orange, pineapple, banana, peach
  94. orange, peach, pineapple, kiwi, banana, apple
  95. banana, kiwi, apple, orange, peach, pineapple
  96. peach, pineapple, orange, banana, apple, kiwi
  97. banana, peach, kiwi, apple, pineapple, orange
  98. apple, kiwi, banana, pineapple, peach, orange
  99. kiwi, orange, pineapple, peach, banana, apple
  100. peach, orange, kiwi, pineapple, banana, apple
扠、此処まで進捗して礑と動きの止まる此の身を事前に見透かしたが如くあるが
いつものように、作り終わったらテストするべきなのですが、 それには少し技がいると思います。 完全にシャッフルしてあると確認するにはどうすればよいのでしょう? というより、完全なシャッフルとはどういうことを言うのでしょうか? それについてもテストしてみましょう。
と引用されるこそ、前半を受けたる常とは異なる様相の、 完全なシャッフルと問われれば全くの思考停止に陥るは、 例えば、操作の前後で配列が入れ替わる、入力と出力が異なれば即ち是シャッフルと云わば、 では、可也の低確率なれど操作の前後で形が揃うが無きにしも有らずとて、 例えば、何某かの配列を変えんとする操作が加われば是シャッフルと云わば、 正しく手品使いのトランプ操作もシャッフルなれど、此れに賛意を示される方の有られるや否や、 と、何うにも堂々巡りのケージ内でランニングホイールを回す栗鼠状態にて、 此処にランダムとシャッフルのアナロジーは別にして、 ランダム関数を利用してシャッフルを実現せんとせば、 コンピュータ上に完全なるランダムの現出の不可能なるを屡聞き及べば、 即ちシャッフルとて其の影響を受けざるを得ず、 検証するに例えばSLAかの如く、処理を繰り返すに当たり、 入力と同配列の出力される確率を百分率にて任意の数値以下に抑えると考えれども、 扠、其処に規則性の有り哉無し哉は、 ガウスやポワンカレ及びペレリマン抔の天才ならぬ凡人たる身には推し量るに及ばず、 此処に灰色の脳細胞は凍結たりて有効なアーカイバは存在しないのであります。

此れは少々入門書と申すには敷居の高く感じられれば幾許かにもヒントが欲しかったとの愚痴と共に、 今回は申し訳なくも悪しからず。

3件のコメント

  1. ブログ上で様々な言語を実行可能なAPI

    当アーティクルタイトルに限った使用法に無きにしは勿論のことなるも、取敢えず自らの理解の為に、先ずは此の如き使用法もありとて、入門的に試用が、404 Blog Not Found運営のアルファブロガー小飼弾氏が提供されるAjax – llevalのサポート言語がさらに増えましたの余りの素

  2. アルファベットソート関数ダウングレード

    初めてのプログラミング当ブログのカテゴリーにも誂える初めてのプログラミングにアーティクルを順次、Ruby及びプログラミングの両者共に入門書として有用なるとは屡ご紹介の初めてのプログラミングに従いエントリを進捗すべき図った積りが、投稿間隔の開くに因ってか、遂に

コメントは受け付けていません。