diff --git a/randomSelect.js b/randomSelect.js index ffda649..87b9ccf 100644 --- a/randomSelect.js +++ b/randomSelect.js @@ -1,45 +1,47 @@ -const pool = require('../db'); - -async function selectStudent(req, res) { - try { - const connection = await pool.getConnection(); - - // 从数据库查询学生 - const [students] = await connection.query('SELECT * FROM students'); - - // 计算权重的总和(使用 softmax 权重计算) - const totalWeight = students.reduce((acc, student) => acc + Math.exp(-student.score), 0); - - // 将每个学生的权重归一化 - const weightedStudents = students.map(student => ({ - student, - weight: Math.exp(-student.score) / totalWeight, - })); - - // 生成随机数 - const random = Math.random(); // 介于 0 和 1 之间 - let sum = 0; // 用于累加权重 - let selectedStudent = null; - - // 遍历加权后的学生,累加权重,并判断随机数落在哪个学生的区间 - for (let i = 0; i < weightedStudents.length; i++) { - sum += weightedStudents[i].weight; // 累加当前学生的权重 - if (random <= sum) { // 如果随机数小于或等于当前的累积权重 - selectedStudent = weightedStudents[i].student; // 选中该学生 - break; // 找到后立即退出循环 - } - } - - if (selectedStudent) { - res.send({ student: selectedStudent }); - } else { - res.status(404).send({ message: '无学生数据' }); - } - - connection.release(); - } catch (error) { - res.status(500).send({ error: '随机选择学生失败' }); - } -} - -module.exports = { selectStudent }; +const pool = require('../db'); + +async function selectStudent(req, res) { + try { + const connection = await pool.getConnection(); + + // 从数据库查询学生 + const [students] = await connection.query('SELECT * FROM students'); + + // 计算权重的总和(使用 softmax 权重计算) + const totalWeight = students.reduce((acc, student) => acc + Math.exp(-student.score), 0); + + // 将每个学生的权重归一化 + const weightedStudents = students.map(student => ({ + student, + weight: Math.exp(-student.score) / totalWeight, + })); + + // 生成随机数 + const random = Math.random(); // 介于 0 和 1 之间 + let sum = 0; // 用于累加权重 + let selectedStudent = null; + + // 遍历加权后的学生,累加权重,并判断随机数落在哪个学生的区间 + for (let i = 0; i < weightedStudents.length; i++) { + sum += weightedStudents[i].weight; // 累加当前学生的权重 + if (random <= sum) { // 如果随机数小于或等于当前的累积权重 + selectedStudent = weightedStudents[i].student; // 选中该学生 + break; // 找到后立即退出循环 + } + } + + if (selectedStudent) { + res.send({ student_name: selectedStudent.student_name, + student_id: selectedStudent.student_id + }); + } else { + res.status(404).send({ message: '无学生数据' }); + } + + connection.release(); + } catch (error) { + res.status(500).send({ error: '随机选择学生失败' }); + } +} + +module.exports = { selectStudent };