第1章はじめてのRuby

Ruby勉強会をやった。18:30くらいから20:00くらい。Ustで流したりもしてみた。たのしいRubyを教材にしている。

  • 全くもってRuby初心者想定
  • 一回あたり一章進むペース
  • 読書会っぽくしようと思ったが、やめた
    • 各自がその週にやる章を読んできて、その章で習うこと中心に問題を作ってくる
    • 90分くらいの時間でその問題を解く、という感じ
      • が、勉強会までに資料を作ってきたのが俺だけで涙目というのは内緒の話

たのしいRuby 第2版 Rubyではじめる気軽なプログラミング

たのしいRuby 第2版 Rubyではじめる気軽なプログラミング

  • Rubyを動かす
    • Windowsの場合
    • Unixの場合
    • MacOS Xの場合
    • 動作確認
  • プログラムの解説
    • オブジェクト
    • メソッド
  • 文字列
    • 改行文字と「\」
    • 「''」と「""」
  • メソッドの呼び出し
  • putsメソッド
  • pメソッド
  • 日本語の表示
  • 数値の表示と計算
    • 数値の表示
    • 四則演算
    • 数学的な関数
  • 変数
  • メントを書く
  • 制御構造
    • 制御構造の分類
  • 条件判断:if〜then〜end
  • 繰り返し
    • while文
    • timesメソッド
  • メソッドの作成
  • 別のファイルを取り込む

print系メソッド

  • puts
    • 勝手に改行してくれる
  • p
    • オブジェクトを内容が確認しやすいような形で表示してくれる

おいらの問題

作りかた

  • randで0から1の間一様乱数を生成する
  • そいつらを12個足し合わせる
  • そのsumから6を引くと標準正規分布N(0,1)ができるらしい

で、

  • 正規乱数がちゃんとできてるか確かめよう
  • Rとかでやったほうが早いけど…
  • 平均と分散くらいはどうにか

おいらの回答

def make_rnorm
  sum = 0.0
  12.times {
    random = rand
    sum = sum+ random
  }
  return sum-6
end

def make_rnorm_array
  rnorm = []
  1000.times {|i|
    rnorm[i] = make_rnorm
  }
  return rnorm
end

def mean(array)
  sum = 0.0
  array.each {|i|
    sum+=i
  }
  return sum/array.size
end

def var(array)
  new_array = []
  count = 0
  array.each {|i|
    new_array[count] = i**2
    count+=1
  }
  puts (mean(array))**2
  var = mean(new_array) - (mean(array))**2
  return var
end

my_array = make_rnorm_array

printf("mean is %10.2G,and variance is %#10.2G\n",mean(my_array),var(my_array))

@y_benjoの問題

ひらがな10文字(あ〜こ)が配列hiraganaにそれぞれ格納されています。で、そこからランダムにひらがなを取り出したいんですが、実際、やりたいのは厳密なランダムではありません。

配列paraにはそれぞれのひらがなに対しての傾斜(1〜100の値)が格納されています。たとえばpara[0]=10とかだと、”あ”に対しての傾斜が10だよ、という意味で。

で、それぞれのひらがなが出る確率はpara[i]/sum(para)という感じで出したいです。まぁ、paraの値が全て等しければなんら問題無いんですけど。

というわけで、引数にhiraganaとparaを使い、傾斜付きなランダムのひらがなを表示するメソッドをお願いします。

2008-01-21 - 糞ネット弁慶

メソッド使わないで、一文字(この文脈での)ランダムで表示させる

hiragana = ["","","","","","","","","",""]

para = [2,1,4,5,6,6,3,4,1,2]

ruiseki = []

sum = 0
count = 0
para.each {|i|
  sum += i
  ruiseki[count] = sum
  count+=1
}

random = rand(ruiseki[-1])
count = 0
true_count = 0

ruiseki[-1].times {|i|
  if random == i
    true_count = i
  end
  count+=1
}

count = 0

ruiseki.each {|i|
  if i >= true_count
    break
  end
  count+=1
}
  
puts hiragana[count]

メソッド使って(この文脈での)ランダムに一文字表示させるメソッドを使い、適当に10文字表示させる

  • 累積密度っぽいことにすることで一対一対応にしてみた
def rand_hiragana(hiragana,para)
  #引数の長さが違うとかは放置プレイ
  ruiseki = []
  sum = 0
  count = 0
  para.each {|i|
    sum += i
    ruiseki[count] = sum
    count+=1
  }

  random = rand(ruiseki[-1])
  count = 0
  true_count = 0

  ruiseki[-1].times {|i|
    if random == i
      true_count = i
    end
    count+=1
  }
  count = 0

  ruiseki.each {|i|
    if i >= true_count
      break
    end
    count+=1
  }
  return hiragana[count]
end
  
hiragana = ["","","","","","","","","",""]
para = [2,1,4,5,6,6,3,4,1,200]
10.times {
  print(rand_hiragana(hiragana,para))
}
print "\n"

その他メモ

  • mapでもできる
  • 「++」はRubyだとできないっぽい