Just do IT

思うは招く

Ruby基礎問題100本ノック#11 サイコロを作る

お題

  • (1)サイコロを降って出た目を返すメソッドdiceを定義せよ
    • サイコロには1〜6の数字がある
    • (もちろん)サイコロなのでランダムに値が返る
  • (2)10個のサイコロを振って出た目の合計を返すメソッドdice10も定義せよ

回答

(1)の回答

def dice(ary)
  puts ary.sample
end
ary = [1,2,3,4,5,6]
dice(ary)
=> 4など

(2)の回答

def dice10(ary)
  count = 0
  10.times do
    count += ary.sample
  end
  puts "合計: #{count}"
end
ary = [1,2,3,4,5,6]
dice10(ary)

説明

(1)の場合

def dice(ary)
  puts ary.sample
end
ary = [1,2,3,4,5,6]
dice(ary)
=> 4など

サイコロの目を入れた配列aryを用意する。 Array#sampleで配列の中からランダムに数値を1つ取り出すので表示する。

(2)の場合

def dice10(ary)
  count = 0
  10.times do
    count += ary.sample
  end
  puts "合計: #{count}"
end
ary = [1,2,3,4,5,6]
dice10(ary)

(1)と同様にサイコロを用意する。 「サイコロを10個振る」ということは、「サイコロを10回振る」と同じ意味なので、10回繰り返す意味で10.times doを使った。

カウンタ変数countに0を代入し、ary.sampleでランダムに取得した数値を足していく。

最後に文字列も交えて出力する。

反省

配列を使わずにもっとシンプルに書けた。

(1)ならこう書ける。

def dice
  Random.rand(6) + 1
end

Random.rand(i)で、「0からi未満」の数値が返る。つまりここでは「0〜6未満」の数値を取得できる。この場合は1〜6を表示したいので、1を足す。

(2)の場合はこう書けた。

def dice
  Random.rand(6) + 1
end

def dice10
  count = 0
  10.times do
    count += dice
  end
  puts count
end
dice10

基本的な考えは同じだが、こっちのほうがシンプルだなぁ。

docs.ruby-lang.org