JavaScript里面如何快速生成乘法口诀练习题?

2022-01-02大约6分钟

问题的背景是这样的:我希望每天能够给小孩出一份乘法口诀的练习题,题目的顺序每天都不重复。作为程序员,肯定是不愿意手动去一道道出题的,那么写程序去生成这些题目是必须的。生成题目简单,二重循环就可以,但是把题目随机排序,有没有简单的办法?

在JavaScript里面,对于数组里面的元素,我们可以使用Array.prototype.sort()来对数组的内容进行排序。使用这个方法,我们可以按照数据的值或属性按照某个规则进行升序或降序来排序。但是,如果我们希望数组里的元素是随机乱序排列的,那该怎么做呢?网上搜索到一种办法,就是通过Math.random()来解决这个问题。

核心的排序函数很简单:

const randomSort = (a, b) => {
    return Math.random() - 0.5;
};

这个是利用Math.random()的结果是伪随机数,范围从0到小于1。减去0.5之后,那么正负的概率刚好各是50%了。所以最终,生成随机题目的代码如下:

const randomSort = (a, b) => {
    return Math.random() - 0.5;
};

const generateChallenges = () => {
    var result = [];
    for (let i = 1; i <= 9; i++) {
        for (let j = 1; j <= 9; j++) {
            result.push(`${i} x ${j} =`);
        }
    }
    return result.sort(randomSort);
};

const printResult = (result) => {
    for (let i = 0; i < result.length; i++) {
        console.log(result[i]);
    }
};

printResult(generateChallenges());

点击运行按钮即可得到结果,然后把生成的题目拷贝出来打印就可以了。结果类似这样:

4 x 6 =
9 x 9 =
2 x 3 =
1 x 4 =
4 x 3 =
3 x 8 =
3 x 9 =
6 x 3 =
3 x 2 =
8 x 4 =
1 x 8 =
4 x 1 =
6 x 2 =
2 x 6 =
4 x 7 =
3 x 5 =
1 x 1 =
2 x 9 =
8 x 1 =
1 x 2 =
7 x 6 =
7 x 4 =
2 x 8 =
9 x 6 =
5 x 6 =
4 x 4 =
1 x 3 =
6 x 8 =
6 x 9 =
8 x 5 =
7 x 7 =
3 x 6 =
7 x 8 =
9 x 3 =
5 x 7 =
2 x 4 =
5 x 9 =
9 x 8 =
4 x 5 =
1 x 5 =
1 x 7 =
4 x 9 =
3 x 7 =
2 x 5 =
8 x 6 =
1 x 9 =
2 x 7 =
5 x 2 =
7 x 3 =
6 x 1 =
5 x 3 =
6 x 7 =
8 x 7 =
7 x 1 =
7 x 5 =
3 x 1 =
8 x 8 =
9 x 4 =
9 x 7 =
9 x 5 =
8 x 3 =
8 x 2 =
4 x 2 =
6 x 5 =
5 x 1 =
5 x 5 =
1 x 6 =
7 x 2 =
5 x 8 =
5 x 4 =
3 x 3 =
7 x 9 =
4 x 8 =
2 x 1 =
6 x 6 =
9 x 1 =
2 x 2 =
6 x 4 =
9 x 2 =
3 x 4 =
8 x 9 =

很短的一段程序,花不了多少时间,但是节省了大量手工出题的时间。上面的程序,用了一段时间,效果还可以,后来老师布置作业要用更复杂的练习来为除法做准备,我就修改了以上的程序,可以支持类似三五( ),二( )十四的练习。

分享出来,希望能帮助到一些人。

const randomSort = (a, b) => {
    return Math.random() - 0.5;
};

const BLANK = '&nbsp;&nbsp;&nbsp;&nbsp;';

const generateChallenges = () => {
    var result = [];
    for (let i = 1; i <= 9; i++) {
        for (let j = 1; j <= 9; j++) {
            const rand = Math.random();
            if (rand < 0.33) {
                result.push(`${i} x ${j} = (${BLANK})`);
            } else if (rand < 0.66) {
                result.push(`(${BLANK}) x ${j} = ${i * j}`);
            } else {
                result.push(`${i} x (${BLANK}) = ${i * j}`);
            }
        }
    }
    return result.sort(randomSort);
};

const printResult = (result) => {
    for (let i = 0; i < result.length; i++) {
        console.log(result[i]);
    }
};

printResult(generateChallenges());