SOURCE

function Random(min, max, num) {
    let result = [];
    for (let i = 0; i < num; i++) {
        result.push(Math.round(Math.random() * (max - min)) + min);
    }
    return result;
}
// console.log(JSON.stringify(Random(0, 10000, 1000)));

function randrange(min, max) {
    var range = max - min;
    if (range <= 0) {
        throw new Error('max必须大于min');
    }
    var requestBytes = Math.ceil(Math.log2(range) / 8);
    if (!requestBytes) {//无需随机性
        return min;
    }
    var maxNum = Math.pow(256, requestBytes);
    var ar = new Uint8Array(requestBytes);
    while (true) {
        window.crypto.getRandomValues(ar);
        var val = 0;
        for (var i = 0; i < requestBytes; i++) {
            val = (val << 8) + ar[i];
        }
        if (val < maxNum - maxNum % range) {
            return min + (val % range);
        }
    }
}

function getRandomArr(min, max, num) {
    let result = [];
    for (let i = 0; i < num; i++) {
        result.push(randrange(min, max));
    }
    return result;
}
// console.log(getRandomArr(0, 100000, 10));


function shuffleArray(arr) {
  for (let i = arr.length - 1; i > 0; i--) {
    const j = Math.floor(Math.random() * (i + 1));
    [arr[i], arr[j]] = [arr[j], arr[i]];
  }
  return arr;
}

function getRandomArray2(len, min, max) {
  const arr = [];
  for (let i = min; i <= max; i++) {
    arr.push(i);
  }
  shuffleArray(arr);
  return arr.slice(0, len);
}

/*
    计算离群值
*/

// 计算数组的中位数
function median(arr) {
    const mid = Math.floor(arr.length / 2);
    const sorted = arr.slice().sort((a, b) => a - b);
    return arr.length % 2 !== 0 ? sorted[mid] : (sorted[mid - 1] + sorted[mid]) / 2;
}

// 计算数组的四分位距
function IQR(arr) {
    const sorted = arr.slice().sort((a, b) => a - b);
    const q1 = sorted[Math.floor(sorted.length * 0.25)];
    const q3 = sorted[Math.floor(sorted.length * 0.75)];
    return q3 - q1;
}

/* 百分位数方法:计算数组的第q1分位数和第q3分位数,然后根据四分位距(q3-q1)确定一个阈值,如果一个数据超过了(q3+阈值)或者(q1-阈值),就被视为离群值。常用的阈值为1.5倍四分位距。 */
// 计算离群值
function outliers(arr, k = 0.9) {
    const m = median(arr);
    const iqr = IQR(arr);
    const lower = m - k * iqr;
    const upper = m + k * iqr;
    console.log('离群值', arr.filter(x => x < lower || x > upper));
    return arr.filter(x => x >= lower && x <= upper);
}

function findTimeUnit(arr) {
    if (arr && arr.length > 1) {
        const out = outliers(arr);
        const median = d3.median(out);
        console.log('平均值', d3.mean(out), median)
        console.log('中位数', d3.median(out), median)
        const seconds = median; // 秒数
        if (seconds < 100) {
            return 'SECOND';
        }
        const minutes = seconds / 60; // 分钟数
        if (minutes < 100) {
            return 'MINUTE';
        }
        const hours = minutes / 60; // 小时数
        if (hours < 100) {
            return 'HOUR';
        }
        const days = hours / 24; // 天数
        if (days < 100) {
            return 'DAY';
        }
        // const weeks = days / 7; // 周数
        return 'WEEK';
    }
    return 'SECOND';
}

function transTo(arr, unit){
    switch(unit){
        case 'SECOND':
            return arr;
        case 'MINUTE':
            return arr.map(a=>Math.floor(a/60));
        case 'HOUR':
            return arr.map(a=>Math.floor(a/60/60));
        case 'DAY':
            return arr.map(a=>Math.floor(a/60/60/24));
        case 'WEEK':
            return arr.map(a=>Math.floor(a/60/60/24/7));
    }
}

// const arr = [9142,4211,8193,6487,1,1094,8342,0,5642,6063,9712,6078,1582,9909,5052,3071,621,675,7039,9006,7409,7737,9885,5135,1258,4983,1708,236,5223,5676,2576,3278,208,1241,7159,9765,2084,5527,2963,8405,183,8645,5519,827,2292,7489,3788,5571,3688,6288,3023,9892,1171,5427,1241,7732,4351,4740,2425,5155,782,4310,6969,6400,7934,4114,9139,8018,4433,7620,7456,6615,3666,7708,7434,8525,2834,6891,2258,7266,92,5543,9003,9828,9182,1445,9149,2464,118,2803,7265,2894,2108,1779,4275,4963,2123,694,1968,1379,7847,7072,867,718,4915,3618,3581,6367,4395,8504,691,5671,7250,575,5304,8211,7529,1955,294,4161,9339,4975,8191,390,5304,8828,7201,82,6343,9273,6353,3121,8152,4093,5629,1170,8851,1814,3087,5416,5846,6587,2986,3942,9054,9347,7536,7275,3053,4668,8657,1923,7230,9256,8291,6781,5294,8638,1872,6083,3779,9929,4724,5427,6011,4521,2825,2101,5235,8920,3182,4920,6088,1173,7725,6227,3052,3144,5379,7276,433,7701,2755,1007,2783,177,4523,4621,7652,6324,6429,8339,333,3670,1915,3750,4188,6076,6075,5151,6975,1865,1107,6657,8809,1111,6881,1890,684,4798,4595,8463,7112,7760,5676,208,3445,6813,3241,9651,7172,9227,2305,6036,1223,9773,8812,1759,829,9147,9003,9535,9642,6204,4980,8163,4831,1993,774,5051,7297,7612,4904,977,791,3385,4007,3009,1788,9356,9914,9802,1229,7581,5772,4388,9713,1440,5869,7359,1244,4208,7861,673,7239,6721,8194,9508,5636,1220,7197,4747,4636,6327,7660,8129,602,865,1024,7495,3071,1560,8826,7206,8434,33,6641,5697,792,9809,2499,8663,6930,4339,6092,5671,8337,3599,2726,5719,8307,3796,6568,2362,6597,10000,2992,8294,3109,100,5535,612,3058,6265,3343,2102,85555,8522,6934,1185,5475,564,1335,8004,2508,8645,129,8038,6826,5938,4604,8887,2575,3133,861,5623,6113,1545,1457,4767,4022,9119,186,1362,2193,1272,8471,9250,4488,6629,8166,1444,3786,5688,9998,858,1948,6456,1620,560,279,9694,4000,5726,6191,7817,2051,7728,1915,5549,1941,6611,9120,5187,7084,138,7618,176,732,596,9402,7160,1898,1014,2214,6502,2887,9620,272,6266,5429,3475,5258,5492,2140,7440,2568,5843,9896,4665,3578,9942,5559,6319,5157,8043,2383,8681,1412,2131,9268,4837,3975,1339,7059,1624,2076,7244,8662,9372,1329,2853,287,505,8798,7705,6193,9807,4562,5400,7495,3183,4271,116,3033,4126,3486,2628,396,6725,1875,4505,789,93,303,9664,7774,719,6686,2867,3385,6813,6160,7895,5954,4487,8713,4652,6427,104,165,7398,9767,7367,7388,2425,3627,369,9741,1510,617,5556,6127,8322,7593,6201,6108,6068,243,6985,2407,268,9009,8448,1373,2755,4822,8188,7728,7537,126,2998,133,2578,8960,1507,4751,9030,6684,3304,4349,5017,3784,7704,7341,5039,7427,9043,1036,4112,3200,529,7402,7415,1118,1211,3417,9164,7155,94,2135,505,7070,3037,1626,7177,184,2776,6519,7172,3216,8800,7687,8194,6282,2916,5395,5553,5814,4058,3097,9541,6328,5566,6484,5700,7814,6612,8604,6848,8694,7653,8231,8270,7840,2678,7859,2429,7339,988,5070,7914,2186,8174,1413,7867,1037,9831,7368,8024,2774,3776,4966,714,6533,5352,8016,2187,3038,1730,7831,8449,4989,7701,4418,3209,7301,7595,8375,8512,4113,9699,9365,9248,4762,1055,4238,4315,9913,4905,9437,6183,5678,2504,2011,5288,6538,162,5521,5289,3016,3014,2585,7417,3584,9791,7194,7138,9442,7808,8191,7845,2031,5229,2042,8090,9376,2250,2141,839,4625,7359,6136,2794,3852,454,9465,5078,6987,2210,3336,8941,2777,2208,414,7809,5463,5721,2881,7083,5584,3257,967,1023,9586,7225,7134,1393,1160,6161,1069,16,5007,2842,2898,1221,1958,9063,6966,8842,9556,9561,2468,5918,6854,1291,9010,8889,4463,6269,3080,5985,1982,1814,6387,173,471,7877,591,5232,105,9902,9220,8411,4020,868,505,9712,5417,8376,171,1954,9318,7173,8815,11,6267,3408,9051,7395,3380,393,9294,4408,4081,8520,5435,6054,9175,3696,2599,1552,9628,1540,7470,9823,2446,6130,2056,5670,2948,3808,1323,1600,8195,4174,7417,8711,5973,2905,2338,5547,1377,7414,1121,9776,9421,4304,6476,4293,9359,4112,2768,1329,658,2129,5117,9665,4964,6703,1673,9740,799,8996,2236,3675,332,5413,2017,6816,3835,1790,7724,9484,4971,1632,3893,1112,8159,6298,7567,4358,5133,5298,6438,3277,315,7873,7445,5916,2828,2051,5704,8615,4526,4340,6663,6067,1585,7251,3318,8726,6385,9668,9371,404,4225,5371,1453,5516,3424,1320,5747,7688,8717,9881,9975,3943,5028,7679,7543,3920,2135,4569,6803,393,429,5635,4796,1644,1489,2389,4156,6844,8448,1118,8092,6738,6674,3700,5950,7235,887,3395,3146,8682,2689,5136,5735,3540,8233,9507,6192,3878,3507,7575,5832,1838,6497,9558,8841,7034,9688,9104,2269,62,2139,7886,5918,7094,5176,9974,2102,6344,3819,5517,1509,9098,4148,879,1552,775,1031,2645,5081,8437,2804,1656,8255,1549,5902,619,1002,5457,990,6855,4109,7911,418,1537,6757,5068,9155,4889,2197,3679,752,5337,2134,4477,8657,7952,3931,8474,7874,5539,5755,2905,4634,6662,8669,6955,5140,8642,7597,9743,4298,7751,7321,9625,1235,2471,2465,8474,6217,546,9463,9430,7117,8726,1224,930,2417,516,377,3978,7531,8209,6466,2550,1056,442,1890,6771,7621,7287,5866,7747,9898,2806,3201,4546,1327,1548,6909,4744,7098,2635,8144,1560,769,7198,8536,5203,952,2641,9104,1804,1820,5732,7592,8486,3886,6403,3017,9391,7739,6974,9339,8029,1011,5290,3339,7108,3688,7103,2518,2710,2340,9455];
// const arr = [2,22];
// const arr = Random(0, 100000, 100);

const arr = getRandomArr(0,100000,100);
console.log(arr);
const unit0 = findTimeUnit(arr);
console.log(unit0);
console.log('===========================================================================================================================================================================');

const arr1 = getRandomArray2(100,0,1000000);
console.log(arr1);
const unit1 = findTimeUnit(arr1);
console.log(unit1);

console.log(transTo(arr1, unit1));

// d3可视化:https://observablehq.com/@d3/d3-random#bates
// console.log(d3.randomInt(50, 100));

console.log('===========================================================================================================================================================================');

const test = [0, 1, 930998, 555591, 4, 595773, 630717, 7, 8, 693276, 10, 11, 496925, 13, 14, 15, 674583, 17, 509994, 19, 20, 21, 984953, 538612, 859712, 25, 26, 802729, 923057, 29, 837739, 741332, 601740, 33, 34, 968287, 670252, 37, 851208, 39, 623638, 883467, 42, 43, 979303, 45, 46, 47, 676117, 49, 642580, 51, 52, 914469, 946523, 733366, 56, 554791, 600799, 59, 776651, 61, 843742, 63, 707886, 65, 66, 67, 68, 941593, 893314, 71, 72, 865072, 840879, 650563, 778655, 866821, 78, 681204, 80, 81, 82, 83, 84, 85, 86, 87, 799414, 89, 968374, 91, 92, 991028, 686174, 95, 96, 935480, 98, 99];
console.log(test.sort((t1,t2)=>t1-t2));

const unit2 = findTimeUnit(test);
console.log(unit2);

console.log(transTo(test, unit2));
console 命令行工具 X clear

                    
>
console