複習小考頁面加入弱點加強模式,錯誤過越多次的題目越容易出現。
<!-- quiz.html -->
<div>
<!-- 加入弱點加強模式 -->
<a href="{{ url_for('quiz', mode='weakness') }}">
<div>
弱點加強模式
<div>根據題目錯誤次數進行重點練習。</div>
</div>
</div>
</a>
</div>
# views.py
def quiz():
mode = request.args.get('mode', 'selection')
# 模式選擇畫面 ...
if mode == 'practice':
# 錯題重練模式邏輯 ...
# 弱點加強模式
elif mode == 'weakness':
# 根據 error_count 加權
title = '弱點加強模式'
weighted_population = [] # 儲存有錯誤紀錄的題目
weights = [] # 儲存權重
for question in all_questions:
error_count = question.get('error_count', 0)
if error_count > 0:
weighted_population.append(question)
weights.append(error_count)
if not weighted_population:
return render_template('quiz.html',
title='無弱點題目可加強',
quiz_data=None,
mode='selection',
error_message='目前沒有答錯的題目紀錄,請選擇隨機出題。')
num_to_sample = min(QUIZ_SIZE, len(weighted_population))
# 使用 random.choices 進行加權抽樣
unique_quiz_data = set()
# 設置上限避免無限循環
max_attempts = num_to_sample * 50
for _ in range(max_attempts):
if len(unique_quiz_data) >= num_to_sample:
break
chosen_question = random.choices(
weighted_population,
weights=weights,
k=1
)[0]
unique_quiz_data.add(tuple(sorted(chosen_question.items())))
# 將結果轉回列表
temp_data = [dict(item) for item in unique_quiz_data]
quiz_data = temp_data[:num_to_sample]
return render_template('quiz.html',
title=title,
quiz_data=quiz_data,
mode=mode)
else:
# 隨機抽題 ...
# 未滿 50 題抽取所有題目
num_to_sample = min(QUIZ_SIZE, len(source_questions))
if num_to_sample > 0:
quiz_data = random.sample(source_questions, num_to_sample)
else:
quiz_data = []
return render_template('quiz.html',
title=title,
quiz_data=quiz_data,
mode=mode)