JavaScript实现实验室随机抽取报告人的逻辑与代码

作者:纸飞机

时间:2026-10-23

浏览:372

本文介绍使用JavaScript实现实验室每周随机抽取三人做报告的功能。针对研一和研二不同分组情况,详细对比了两种算法思路:一是先从小组数组抽取再合并去重,二是从总数组抽取后校验同组约束。文章提供了思路二的完整实现代码,解决同组人员不能重复抽取的问题,并分析了思路一中遇到的逻辑难点。

文章目录

需求背景与目标

由于实验室每周需要安排三人进行报告,因此使用JavaScript开发了一个随机抽取的网页界面。

首先明确具体需求:研二学生共有5人,其中一人单独成组;研一学生共9人,分为三个小组。因此总共有8个小组。每周报告的三人需从这8个小组中抽取,且约束条件是这三人不能有两人在同一组。

算法思路一:分步抽取与合并

程序设计的思路一。

1. 将研一的三个小组分别构建为独立的数组,从这三个数组中各随机抽取一人; 2. 将第一步中抽取出的三人与研二的五人合并,组成一个新的数组,并从中随机抽取三人; 3. 若随机抽取的三人中存在两人或以上来自同一组的情况,则返回第一步重新执行随机抽取,直到满足条件后输出结果;

算法思路二:全局抽取与校验

程序设计的思路二。

将实验室所有成员放入一个大数组中,首先从该数组中随机抽取三人; 随后将研一的三个小组构建为独立的数组,对随机抽取出的三人进行循环判断,检查是否存在两人或以上在同一组的情况;

代码实现与问题分析

最终实现过程。

原本认为思路一较为简单,但在实际编码中发现,判断是否同组后重新调用函数运行总是出现问题。虽然理论上可以通过for循环判断选出的三个人,但实际无法实现,需要进一步仔细思考。思路一的程序代码如下:


for (var i=0;i<3;i++) {
  index1 = Math.round(Math.random()*(array.length-1));
  value = array[index1];

  newarray.push(value);
  array.splice(index1,1);

  value ='';
 }
 console.log(newarray);

 for (var j =0;j<newarray.length;j++) {
  for (var m = 0; m < arr1.length; m++) {
   if (newarray[j] === arr1[m]){
    num1++;
   }
  }
  for (var n = 0; n < arr2.length; n++) {
   if (newarray[j] === arr2[n]){
    num2++;
   }
  }
  for (var o = 0; o < arr3.length; o++) {
   if (newarray[j] === arr3[o]){
    num3++;
   }
  }
 }
 btn.onclick = function (){


 var id = setInterval(frame,500);
 function frame() {
  if (!flag) {
   clearInterval(id);
   flag=true;
  } else {
   Begin();
   document.getElementById("name").innerHTML="";
   for (var i = 0; i < newarray.length; i++) {
    document.getElementById("name").innerHTML += newarray[i] + "</br> ";

   }
   flag=false;
   newarray=[];
  }
 }

}

尽管上述代码存在一些问题,但思路二可以正常实现。以下是思路二的程序代码:


function Begin() {
  num1 = Math.round(Math.random() * (arr4.length - 1));
  num2 = Math.round(Math.random() * (arr4.length - 1));
  num3 = Math.round(Math.random() * (arr4.length - 1));
  Begin2();
 }

 function Begin2() {
  var array = [];
  var arrayLast = [];
  if (num1 !== num2 && num1 !== num3 && num2 !== num3) {
   array.push(num1);
   array.push(num2);
   array.push(num3);
   for (var i = 0; i < array.length; i++) {
    if (typeof arr4[array[i]] === "string") {
     arrayLast.push(arr4[array[i]]);
    } else {
     var num4 = Math.round(Math.random() * (arr4[array[i]].length - 1));
     arrayLast.push(arr4[array[i]][num4]);
    }
   }
  } else {
   Begin();
  }

  console.log(arrayLast);
  document.getElementById("name").innerHTML="";
  for (var i = 0; i < arrayLast.length; i++) {
   document.getElementById("name").innerHTML += arrayLast[i] + "</br> ";
  }
 }

 btn.onclick = function () {
  Begin();

 }

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持本站。

实用工具推荐

电子包浆

绿化、压缩、噪点和虚拟水印,自由调节做旧程度。

使用 ›
图片压缩

选择画质和输出格式,预览压缩前后的大小。

使用 ›
相关文章