0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

初学者メモ シャッフル

Posted at

はじめに

投稿2回目!
「画面上で複数人をランダムに2グループに分けたい」
「特定の条件の比率を揃えたい」
Rubyのメソッドを調べて試行錯誤した記録です

手順

  1. 条件を設ける
  2. ランダムにシャッフル
  3. シャッフルした者をグループに割り当てる

実装

①特定の条件に分ける

selectメソッドを使用

配列.select { |要素| 条件式 }

今回は男女比率を合わせる

controller.rb
male = students.select { |student| student.gender == "male" }
female = students.select { |student| student.gender == "female" }

②各グループの人数を決定

グループ数は2とします

controller.rb
group_count = 2

各グループの男女の人数を計算

controller.rb
male_per_group = (male.size.to_f / group_count).ceil
female_per_group = (female.size.to_f / group_count).ceil

Floatクラスのceilメソッドを使用

浮動小数点数.ceil

浮動小数点数を切り上げできます

③いよいよシャッフル!

contoroller.rb
male.shuffle!
female.shuffle!

元の配列自体を並び替えたいため破壊的メソッドを使用

配列.shuffle!

④グループごとに割り当てる

あとは、配列を用意し、割り当てるだけ

controller.rb
# グループ分けの結果を格納する配列
groups = []

# グループごとにそれぞれ割り当てる
group_count.times do |i|
  group = []

  # maleから割り当て
  group.concat(male.shift(male_per_group))

  # femaleから割り当て
  group.concat(female.shift(female_per_group))

  groups << group

end

# グループ分け結果をビューに渡す
@grouped = groups

メモ①「concatメソッド」

group.concat(引数)

concatで指定した引数がgroup配列に追加される

メモ②「shiftメソッド」
concatの引数

male.shift(数値)
female.shift(数値)

配列の先頭から指定した数の要素を取り出せる
メモ③演算子「<<」で 要素を追加

こちらに追加 << こちらから

まとめ

  • selectメソッドで配列から特定の条件に合うものを選べる
  • ceilで浮動点小数点を切り上げできる
  • shuffle!で配列自体を並び替えられる
  • concat メソッドで指定したものを配列に追加できる
  • shiftメソッドで、配列の先頭から指定した要素を取り出せる

Rubyの文法が大切だと身に染みて感じました
2回目の投稿
ご指導、ご指南いただけると幸いです

0
0
3

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?