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

2017-05-29 13:29:46 +08:00
 slucus

有一个数组

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()
2439 次点击
所在节点    JavaScript
8 条回复
codehz
2017-05-29 13:46:28 +08:00
首先定义随机。。。。
然后把所有可能的排列写出来。。。。
随机取其中的一个。。。。
问题解决
lrz0lrz
2017-05-29 15:19:08 +08:00
你更想要的是均匀而不是随机吧?
slucus
2017-05-30 08:42:10 +08:00
@lrz0lrz 均匀是建立在随机的基础上的。。。。
slucus
2017-05-30 08:42:58 +08:00
@codehz 这种。。。。太 low 了。。。
- -!
slucus
2017-05-30 08:50:28 +08:00
现在随机数是取出来了,但是取到的值并不理想:只能取到两组值,1256、0347。像 0 和 6 永远都不会出现在一组里,所以这样取到的数据是有缺陷的,在很多平台都提问过,但各位大神给的答案都不是很理想。。哎╮(╯▽╰)╭
slucus
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
2017-05-30 10:30:00 +08:00
@slucus #6 上下还是相邻的
slucus
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]);
}
}

这样是交叉取的,不会重复的。。。取到以后再进行随机

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/364569

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX