wingmeng / front-end-quiz

前端小测试答题收集
0 stars 0 forks source link

JS基础测试31:种子随机数 #11

Open wingmeng opened 5 years ago

wingmeng commented 5 years ago

题目:

image


我的回答:

预期是达到了,就是算法复杂度有点高了…… > 测试 DEMO <

function getRandomSkins(uid, skins) {
  skins = skins instanceof Array ? skins : [];

  if (!uid) {
    return skins;
  }

  // 1.将 uid 的每个字符串元字符转换为编码值,组合成一个数字
  var charCodes = String(uid).split('').reduce(function(total, cur) {
    return total + (isNaN(cur) ? cur.charCodeAt() : cur);
  }, '');

  // 2.使用上一步生成的数字生成一个和皮肤数组长度一致的字符串数字
  var seed = String(Math.sin(charCodes)).split('.')[1].substr(0, skins.length);      

  // 3.将上一步生成的字符串数字打散添加到皮肤数组的每一项中,用于排序
  var result = skins.map(function(item, idx) {
    item._order = Number(seed[idx]);
    return item;
  });

  return (
    // 4.根据 order 排序
    result.sort(function(o, p) {
      return o._order - p._order;
    })

    // 5.移除 order,还原数组本来面貌
    .map(function(item) {
      delete item._order;
      return item;
    })
  )
}
wingmeng commented 5 years ago

自我评分:一般

优秀、良好、一般、差劲

不足之处:

  1. 代码不够精简,太罗嗦;

学习收获:

  1. 首次学习种子随机数相关知识
wingmeng commented 5 years ago

最佳实践

作者:张鑫旭

demo

var arr = [{skin:1},{skin:2},{skin:3},{skin:4},{skin:5},{skin:6},{skin:7},{skin:8},{skin:9},{skin:10}]

var randArr = function (seed) {
  // 变成数值
  seed = seed.replace(/\D/g, function (matchs) {
    return matchs.charCodeAt();
  });
  // 变成随机数值
  var str = Math.sin(seed).toString().slice(3);
  // 补全,万一数组长度很长
  var arrStr = str.padStart(arr.length, str).split('');
  // 随机
  return [...arr].map(function (obj, index) {
     obj.rand = +arrStr[index];
     return obj;
  }).sort(function (objA, objB) {
    return objA.rand - objB.rand;    
  }).map(function (obj) {
     delete obj.rand;
     return obj;
  });
};

console.dir(randArr('abc001'));
console.dir(randArr('abc001'));
console.dir(randArr('abc002'));
console.dir(randArr('abc003'));