V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
推荐关注
Meteor
JSLint - a JavaScript code quality tool
jsFiddle
D3.js
WebStorm
推荐书目
JavaScript 权威指南第 5 版
Closure: The Definitive Guide
slucus
V2EX  ›  JavaScript

关于数组取随机数的问题?

  •  
  •   slucus · 2017-05-29 13:29:46 +08:00 · 2580 次点击
    这是一个创建于 2771 天前的主题,其中的信息可能已经有所发展或是发生改变。

    有一个数组

    var a = [
      [0, 1],
      [2, 3],
      [4, 5],
      [6, 7]
    ];
    

    如何实现更均匀随机取里面的 2 到 3 个数字(取到的数字上下左右不相邻)?

    之前自己倒腾了一个,但是感觉代码写的太臃肿,而且去到的数也不平均,各位大神帮忙看看能不能优化一下,谢谢!

    function select() {
      var arr = [
        [0, 1],
        [2, 3],
        [4, 5],
        [6, 7]
      ];
    
      var lastSelect = -1;
    
      for (var i = 0; i < arr.length; i++) {
    
        var index = getRandomNumber(lastSelect, arr[i].length);
    
        console.log(arr[i][index]);
    
        lastSelect = index;
      }
    
    }
    
    function getRandomNumber(lastSelect, max) {
      var random = Math.floor(Math.random() * max);
      if (random == lastSelect) return getRandomNumber(lastSelect, max);
      else return random;
    }
    
    select()
    
    8 条回复    2017-05-30 10:36:28 +08:00
    codehz
        1
    codehz  
       2017-05-29 13:46:28 +08:00
    首先定义随机。。。。
    然后把所有可能的排列写出来。。。。
    随机取其中的一个。。。。
    问题解决
    lrz0lrz
        2
    lrz0lrz  
       2017-05-29 15:19:08 +08:00   ❤️ 1
    你更想要的是均匀而不是随机吧?
    slucus
        3
    slucus  
    OP
       2017-05-30 08:42:10 +08:00
    @lrz0lrz 均匀是建立在随机的基础上的。。。。
    slucus
        4
    slucus  
    OP
       2017-05-30 08:42:58 +08:00
    @codehz 这种。。。。太 low 了。。。
    - -!
    slucus
        5
    slucus  
    OP
       2017-05-30 08:50:28 +08:00
    现在随机数是取出来了,但是取到的值并不理想:只能取到两组值,1256、0347。像 0 和 6 永远都不会出现在一组里,所以这样取到的数据是有缺陷的,在很多平台都提问过,但各位大神给的答案都不是很理想。。哎╮(╯▽╰)╭
    slucus
        6
    slucus  
    OP
       2017-05-30 10:08:08 +08:00
    已经找到更优的方案,谢谢大家!

    var a = [
    [0, 1],
    [2, 3],
    [4, 5],
    [6, 7]
    ];

    function select() {
    var random = Math.round(Math.random());
    for (var i = 0; i < a.length; i++) {
    console.log(a[i][(i + Math.round(Math.random())) % 2]);
    }
    }
    select()
    lrz0lrz
        7
    lrz0lrz  
       2017-05-30 10:30:00 +08:00
    @slucus #6 上下还是相邻的
    slucus
        8
    slucus  
    OP
       2017-05-30 10:36:28 +08:00
    @lrz0lrz 是呀,还需要进行判断删减

    function select() {
    var random = Math.round(Math.random());
    for (var i = 0; i < a.length; i++) {
    console.log(a[i][(i + random) % 2]);
    }
    }

    这样是交叉取的,不会重复的。。。取到以后再进行随机
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2556 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 23ms · UTC 05:55 · PVG 13:55 · LAX 21:55 · JFK 00:55
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.