2015-01-02 93 views
1

我在計算Ruby和Rails中的加權比率時遇到了問題。作爲一個說明性的情景,假設我們有一個學校班級的加權平均成績計算。我有分別具有0.25,0.50和0.25級別權重的測試「a」,「b」和「c」。 Jenny的分數分別爲0.95,0.85和零,她在最後一次考試中獲得豁免。當學生免於考試時,其權重不應該被視爲對他們不利。考慮下面的jenny_grade_scores是一個ActiveRecord對象,TEST_WEIGHTS是模型中的一個常量。加權平均等級計算 - 無零散迭代

jenny_grade_scores = { "test_a" => 0.95, "test_b" => 0.85, "test_c" => nil } 

TEST_WEIGHTS = { "test_a_weight" => 0.25, "test_b_weight" => 0.50, "test_c_weight" => 0.25 } 

什麼是計算該加權分數比使用更有效的方式:

jenny_test_weights = TEST_WEIGHTS #initialize a student test weight variable and adjust if test score is nil 
jenny_test_weights["test_a_weight"] = 0.0 if jenny_grade_scores["test_a"].nil? 
jenny_test_weights["test_b_weight"] = 0.0 if jenny_grade_scores["test_b"].nil? 
jenny_test_weights["test_c_weight"] = 0.0 if jenny_grade_scores["test_c"].nil? 


numerator = (jenny_grade_scores["test_a"] * jenny_test_weights["test_a_weight"] +jenny_grade_scores["test_b"] * jenny_test_weights["test_b_weight"] + jenny_grade_scores["test_c"] * jenny_test_weights["test_c_weight"]) 

denominator = (jenny_test_weights["test_a_weight"] + jenny_test_weights["test_b_weight"] + jenny_test_weights["test_c_weight"]) 

final_score = numerator/denominator 

在這個例子中,結果應該是0.88333333

+0

0.6625是分子和0.75是分母= 0.883333 – UserDuser

+0

否分母爲1(= 0.25 + 0.5 + 0.25) –

+0

Jenny的等級分數爲測試c是零,從而分母珍妮應該是0.75。請參閱jenny_test_weights [「test_c_weight」] = 0.0如果jenny_grade_scores [「test_c」]。nil? – UserDuser

回答

4

怎麼樣將所有的考試成績浮動?

>> jenny_grade_scores.inject({}) { |hash, array| hash[array[0]] = array[1].to_f; hash }   
=> {"test_a"=>0.95, "test_b"=>0.85, "test_c"=>0.0} 

如果你不介意重構你的代碼,考慮以下因素:

WEIGHTS = { a: 0.25, b: 0.5, c: 0.25 } 

grades = { a: 0.95, b: 0.85 , c: nil } 

SUM_OF_WEIGHTS = WEIGHTS.inject(0) do |sum, (test, weight)| 
    sum += grades[test].nil? ? 0 : weight 
end # => 0.75 

weighted_score = grades.inject(0) do |w, (test, score)| 
    w += (score.to_f * WEIGHTS[test]) 
end # => 0.6625 

final_score = weighted_score/SUM_OF_WEIGHTS # => 0.8833333333333333 

腳註:

  1. 重命名測試鍵相同的密鑰在所有相關的哈希值可以簡化問題。
  2. nil轉換爲浮點數時變爲0.0。
  3. inject & reduce可以優雅地進行求和或類似的相關操作。如果你不熟悉Ruby,可以試試&。
  4. 更新了非罰分重量計算。
+0

您的腳註非常好,我肯定會重構我的醜陋代碼 - 謝謝。注入和減少對我來說都是新的,所以我有一些閱讀要做。在回答您對我的問題的評論中提到的分母是否有更好的處理方法? – UserDuser

+0

當然,我剛更新了非罰分重量計算。 –

+0

非常好,謝謝。 – UserDuser