ZYMKJ 发表于 2023-2-16 14:04:21

编写脚本自动随机答题的一些思路及小成果

本帖最后由 ZYMKJ 于 2023-2-17 11:46 编辑

> 本帖最后由 ZYMKJ 于 2023-2-16 14:04 编辑

最近再写一个在线学习的脚本。每一个课程学完,需要做随堂练习,并且需要达到一定分数才能进入下一个课程。手动答题比较比较耽误做其他工作,所以学习了2天,写了一段简单的答题代码,所有答题均随机。

备注:所有答案选项的ID 都是统一格式:#questions_0_0 (第一题第一个选项),#questions_1_1 (第2题第二个选项)。

判断题:2选1,比较简单,50%的成功率。代码如下:0
```
var pd = function(){return Math.random() < 0.5 ? 0 : 1}       //随机生成0和1
document.querySelector('#questions_0_'+pd()).click()//搜索带入变量pd
```

单选题:4选1,也还算简单,25%的成功率。代码如下:
```
var dx = function(){return Math.floor(Math.random()*4)}//随机生成一个大于等于0,小于3的数
document.querySelector('#questions_1_'+dx()).click()
```

多选题:比较复杂,在学习2天后,用了1天尝试了多种方法后完成,代码如下:
```
var xxgs =document.querySelectorAll('').length //xxgs选项个数
var a= new Array();
var b = document.querySelectorAll('')//把所有答案选项,放入列表
//下面代码为,列表b全部元素转为数组a的对象,为随机排序做准备
for (let i = 0; i < xxgs; i++) {
    var ele = b;
    a.push(ele);
}   
//下列代码:给数组a随机排序,并导入数组c。(洗牌算法,排序概率比较平均)
var c
function shuffle(array){
    let res = [], random;
    while(array.length>0){
      random = Math.floor(Math.random()*array.length);
      res.push(array);
      array.splice(random, 1);
       }
    return res;
}
c=shuffle(a);
//随机生成多选,选几个答案
var xjg = function(){return Math.round(Math.random()*(xxgs-2)+2)}
//for循环,选择随机排序数组c的前xjg答案
for(let j=0;j<xjg;j++){
    c.click();
}
```

提交答案:这个就简单了。
```
setTimeout(document.querySelector('#submitBt').click(),200)
```

PS. 把过程进行了封装,直接调用就OK。更新代码如下:
```
/*
说明:
        1、DXT:单选;
        2、PDD:判断题
        3、duoXuan:多项选择题
        4、DJT:第几道题
        5、XXGS:选项个数
        6、MAX:最多选几个答案
        7、MIN:最少选几个答案
        举例:
        duoXuan(3,5,5,2)
        多项选择题,第3道题,一共5个选项,最多选5个,最少选2个
*/

function DXT(DJT,XXGS){
        let XH = DJT-1
        let dx = function(){return Math.floor(Math.random()*XXGS)}       
        document.querySelector('#questions_'+XH+'_'+dx()).click()
}
                       
function PDD(DJT,XXGS){
        let XH = DJT-1
        let pd = function(){return Math.random() < 0.5 ? 0 : 1}               
        document.querySelector('#questions_'+XH+'_'+pd()).click()
}
               
function duoXuan(DJT,XXGS,MAX,MIN){
        let a = new Array();
        let XH = DJT-1;
        for (let m =0;m<XXGS;m++){
                let ele = document.querySelector('#questions_'+XH+'_'+m);
                a.push(ele);
        }
        function shuffle(array){
                let res = [], random;
                while(array.length>0){
                        random = Math.floor(Math.random()*array.length);
                        res.push(array);
                        array.splice(random, 1);
                }
                return res;
        }
        let c = shuffle(a)
        let xjg = function(){return Math.floor(Math.random()*(MAX-MIN+1)+MIN)}
        for(let j=0;j<xjg;j++){
                c.click();
        }
}
```

steven026 发表于 2023-2-16 14:24:37

const num=5; //选项数量
const arr=[...Array(5)].map((_,i)=>i) //初始化选项
arr.sort(()=>Math.random()-0.5) //随机排序
const result=arr.slice(0,Math.floor(num*Math.random())) //随机数量
随便写的多选题随机,没有算法纯随机

王一之 发表于 2023-2-16 14:27:39

一般就取选项的element,一般是数组,然后Math.random生成数组下标操作了

李恒道 发表于 2023-2-16 14:29:04

如果题量低可以考虑
https://bbs.tampermonkey.net.cn/forum.php?mod=viewthread&tid=3350&highlight=sqlite
node+sqlite分词搜索,一个下午就能搭出来服务器

ZYMKJ 发表于 2023-2-16 14:29:23

steven026 发表于 2023-2-16 14:24
随便写的多选题随机,没有算法纯随机

这个随机,我看过。随机不平均。所以没用。。

ZYMKJ 发表于 2023-2-16 14:37:02

王一之 发表于 2023-2-16 14:27
一般就取选项的element,一般是数组,然后Math.random生成数组下标操作了

<input type="radio" id="questions_0_0" name="examPaper.questions.selectionAnswers.selected"                                                                                                                                                                                value="true"                                                                                                                                                                                onclick="passValue(this,'questions_0')" />                                                                                                                                                                        产品用料                                                                                                                                                                        <br />

怎么应该怎么根据element 选择呢?

王一之 发表于 2023-2-16 14:53:11

ZYMKJ 发表于 2023-2-16 14:37
产品用料                                                                                                                                                                       

怎么应该怎么根据element 选择呢? ...

应该都有特征的,可以

类似 document.querySelector("") 这样,会一个element数组

ZYMKJ 发表于 2023-2-17 08:04:52

王一之 发表于 2023-2-16 14:53
应该都有特征的,可以

类似 document.querySelector("") 这样,会一个element数组 ...

OK 我试试
页: [1]
查看完整版本: 编写脚本自动随机答题的一些思路及小成果