わさっきhb

大学(教育研究)とか ,親馬鹿とか,和歌山とか,とか,とか.

降順と昇順を組み合わせたソート〜データ生成

降順と昇順を組み合わせたソート - わさっきの答え(Rubyスクリプト)を書く前に,ソートのためのデータを生成しないといけません.

#!/usr/bin/env ruby

# ddgenerator.rb

require 'date'
require 'pp'

def generate(seed = 20080722,
             date_from = Date.new(2008, 4, 1),
             date_to = Date.new(2009, 3, 31))
  srand(seed) if seed
  array = []

  date_from.upto(date_to) do |date|
    num_max = rand(10)
    1.upto(num_max) do |num|
      array.insert(rand(array.size + 1), "#{date.strftime('%Y%m%d')}-#{num}")
    end
  end

  array
end

pp generate

乱数のシードと,日付の最初と最後を引数にとり,"YYYYMMDD-N"の文字列を生成して,配列にランダムに挿入していきます.Nすなわち通し番号の最大値は,1以上9以下で,年月日(というか乱数系列)によって変わります.
Date型オブジェクトに対してuptoを使う例は,1日1行カレンダー - わさっきにもあります.
配列の要素の並びをランダムにする*1には,shuffleメソッドもありますが,あえて使っていません.挿入の処理で,「rand(array.size + 1)」のところを「rand(array.size)」とすると,最初に挿入した値(デフォルトの呼び出しだと "20080401-1")が,常に配列の最後になってしまいます.

*1:それをしないと,ソートするのが無駄です.まあ,今回の問題を考えるのが時間の無駄と言われればそこまでですが.