• 如果您觉得本站非常有看点,那么赶紧使用Ctrl+D 收藏吧

随机数和数组乱序

互联网 diligentman 4周前 (10-30) 18次浏览

https://juejin.im/post/6844903863812620296

随机数

某次大佬分享随机数相关东西, 讲着讲着直接打开v8源码… 给我幼小的心灵造成了成吨的伤害….

py的numpy里有很多种随机算法, 最常用的是线性分布和正太分布, js里面用的不多

 

第一, js中的random随机性不是很好, 并且不能设置seed

随机选择0-1000中每个数字出现的次数

随机数和数组乱序

const size = 1000;
const count = 100000;
const list = Array(size).fill(0);
for (let i = 0; i < count; i++) {
  const v = (Math.random() * size) | 0;
  list[v]++;
}

console.log("[" + list.join(",") + "],");

 

用了random和chance库好像也差不多, 还是chance好用一点, 不知道引入的成本是不是很大 … 

随机数和数组乱序

https://chancejs.com/

随机数和数组乱序

const random = require("random");
const size = 1000;
const count = 100000;
const list = Array(size).fill(0);
const f = random.uniformInt(0, size - 1)
for (let i = 0; i < count; i++) {
  const v = f()
  list[v]++;
}
console.log("[" + list.join(",") + "],");

 

数组乱序

随机排序确实表现很不好, 主要原因也确实是因为对于一个有序数组, 再次排序的过程不是随机的

随机数和数组乱序

数组乱序, lodash的shuffle还是可以的

随机数和数组乱序

 

随机交换, 基本达到相同的效果, 方向无所谓, 主要是这种方法能够比较均衡的照顾所有元素

随机数和数组乱序

const random = require("random");
const _ = require("lodash");
function test_shuffle(shuffleFn) {
  // 多次乱序数组的次数
  let n = 100000;
  // 保存每个元素在每个位置上出现的次数
  let countObj = {
    a: Array.from({ length: 10 }).fill(0),
    b: Array.from({ length: 10 }).fill(0),
    c: Array.from({ length: 10 }).fill(0),
    d: Array.from({ length: 10 }).fill(0),
    e: Array.from({ length: 10 }).fill(0),
    f: Array.from({ length: 10 }).fill(0),
    g: Array.from({ length: 10 }).fill(0),
    h: Array.from({ length: 10 }).fill(0),
    i: Array.from({ length: 10 }).fill(0),
    j: Array.from({ length: 10 }).fill(0),
  };
  for (let i = 0; i < n; i++) {
    let arr = ["a", "b", "c", "d", "e", "f", "g", "h", "i", "j"];
    arr = shuffleFn(arr);
    countObj.a[arr.indexOf("a")]++;
    countObj.b[arr.indexOf("b")]++;
    countObj.c[arr.indexOf("c")]++;
    countObj.d[arr.indexOf("d")]++;
    countObj.e[arr.indexOf("e")]++;
    countObj.f[arr.indexOf("f")]++;
    countObj.g[arr.indexOf("g")]++;
    countObj.h[arr.indexOf("h")]++;
    countObj.i[arr.indexOf("i")]++;
    countObj.j[arr.indexOf("j")]++;
  }
  console.table(countObj);
}

const shuffleFn = (list) => {
  for (let i = 0; i < list.length - 1; i++) {
    const j = random.int(i, list.length - 1);
    const t = list[i];
    list[i] = list[j];
    list[j] = t;
  }
  return list;
};
//
test_shuffle(shuffleFn);
// test_shuffle(_.shuffle)

 


喜欢 (0)