需求: 有192条数据, 随机从里面取出45条不重复的数据, 保存到另一个数组当中
请写出最优的算法.
/**
 * 需求: 有192条数据, 随机从里面取出45条不重复的数据, 保存到另一个数组当中
 * 解答: 请写出最优的算法.
 * Created by mao-siyu on 17-12-5.
 */

// 先将192条数据平均分
// step 1 取余(结果是 12)
let s1 = 192 % 45;

// step 2 均分 并获取每段长度(结果是 4)
let s2 = (192 - s1) / 45;

// step 3 循环45次 从192条数据中随机获取数据(也就是在192这个范围内, 循环出45个不重复的随机数.)
// 但这样只能取得 范围是 180 的平均结果(还差 12)
for (let i = 0; i < 45; i++) {
    let temp = Math.floor(Math.random() * s2) + i * s2; // s2 = 4
}

// step 4 解决上面的问题 还需要加上12个数才能满足是从192这个范围内随机选取, 所以在加上 12
// 但这样, 最小数又变成了12, 所以不能将 12写死.
for (let i = 0; i < 45; i++) {
    let temp = Math.floor(Math.random() * s2) + i * s2 + s1; // s2 = 4  s1 = 12
}

// step 5 解决上面的问题 将12也变成随机数
let s5 = Math.floor(Math.random() * s1); // s1 = 12
for (let i = 0; i < 45; i++) {
    let temp = Math.floor(Math.random() * s2) + i * s2 + s5; // s2 = 4 s5 = (0~12随机数)
    console.log(temp);
}

/**=============================最终实现代码=========================================*/
const p192 = [];
const p45 = [];
for (let i = 1; i <= 192; i++) {
    p192.push(i);
}

let step1 = p192.length % 45;
let step2 = (p192.length - step1) / 45;

let step5 = Math.floor(Math.random() * step1);
for (let i = 0; i < 45; i++) {
    let index = Math.floor(Math.random() * step2) + i * step2 + step5;
    p45.push(p192[index]);
}

for (let i = 0, len = p45.length; i < len; i++) {
    console.log(p45[i]);
}
分类: JavaScript

毛巳煜

高级软件开发全栈架构师

工信部备案号:辽ICP备17016257号-2