Ruby勉強会をやった。18:30くらいから20:00くらい。Ustで流したりもしてみた。たのしいRubyを教材にしている。
- 全くもってRuby初心者想定
- 一回あたり一章進むペース
- 読書会っぽくしようと思ったが、やめた
- 各自がその週にやる章を読んできて、その章で習うこと中心に問題を作ってくる
- 90分くらいの時間でその問題を解く、という感じ
- が、勉強会までに資料を作ってきたのが俺だけで涙目というのは内緒の話
たのしいRuby 第2版 Rubyではじめる気軽なプログラミング
- 作者: 高橋征義,後藤裕蔵
- 出版社/メーカー: ソフトバンククリエイティブ
- 発売日: 2006/08/05
- メディア: 単行本
- 購入: 11人 クリック: 350回
- この商品を含むブログ (259件) を見る
- Rubyを動かす
- Windowsの場合
- Unixの場合
- MacOS Xの場合
- 動作確認
- プログラムの解説
- オブジェクト
- メソッド
- 文字列
- 改行文字と「\」
- 「''」と「""」
- メソッドの呼び出し
- putsメソッド
- pメソッド
- 日本語の表示
- 数値の表示と計算
- 数値の表示
- 四則演算
- 数学的な関数
- 変数
- メントを書く
- 制御構造
- 制御構造の分類
- 条件判断:if〜then〜end
- 繰り返し
- while文
- timesメソッド
- メソッドの作成
- 別のファイルを取り込む
print系メソッド
- puts
- 勝手に改行してくれる
- p
- オブジェクトを内容が確認しやすいような形で表示してくれる
おいらの問題
- 一様乱数から正規乱数を発生させよう
- そんなんできるの?
- できるらしいです
- http://case.f7.ems.okayama-u.ac.jp/statedu/lispstat-book/node96.html
- 中心極限定理をもちいると一様乱数から生成できるっぽい
作りかた
- 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だとできないっぽい