繁体   English   中英

如何从 Javascript 中的数组中获取元素的随机组合?

[英]How do i get a random combination of elements from an array in Javascript?

我看到许多函数给出一个随机元素或数组中元素的所有组合,但我试图找出每次都返回随机组合的东西。

ex) let array1 = ["mike", "ted","bill","mark"];

sample outputs would be like this 
output1 = mike, ted
output2= ted
output3 = mark,ted,bill,mike
output4 = mike, bill

它可能是所有元素或只是一个随机元素。

复制原始数组。 生成一个介于 1 和副本长度之间的随机数 n,然后循环 n 次,从复制的数组中得到一个随机索引 n 次。 这就是您获得“名称”值的地方。 确保每次拼接复制的数组以避免重复:

更新:

在执行代码的 rest 之前,我添加了一行以使用Array.slice()复制原始数组:

 let array1 = ["mike", "ted","bill","mark"]; let arrCopy = array1.slice() let ranIdx let resArr = [] let ranLen = Math.floor(Math.random() * arrCopy.length) + 1 for(i=0; i < ranLen; i++){ ranIdx = Math.floor(Math.random() * arrCopy.length) resArr.push(arrCopy.splice(ranIdx,1)[0]) } console.log(resArr)

也许像这样:

 let array1 = ["mike", "ted","bill","mark"]; function get_random_in_range(_min, _max) { _min = Math.ceil(_min); _max = Math.floor(_max); return Math.floor(Math.random() * (_max - _min + 1)) + _min; } function get_randoms(_arr){ var out = []; var count_of_rnd_out = get_random_in_range(0, _arr.length-1); for (var i = 0; i < count_of_rnd_out+1; i++) { var rnd_el_index = get_random_in_range(0, _arr.length-1); var rnd_el = _arr[rnd_el_index]; while(out.indexOf(rnd_el) >= 0) { /* for exclude duplicates */ rnd_el_index = get_random_in_range(0, _arr.length-1); rnd_el = _arr[rnd_el_index]; } out.push(rnd_el); } return out; } console.log(get_randoms(array1));

也许这个 package 可能有用

通过使用此代码

cmb = Combinatorics.power(['a','b','c']);

它将生成数组的所有组合。 然后,您可以生成一个介于 0 和数组长度(含)之间的数字到 select 您的随机 output。

我会在 function 上写这个,它部分地打乱一个数组,从它返回一个随机选择的前n元素。 此外,我会随机选择要选择的元素数量。 我们可以使用边界(“从列表中选择 1 到 3 个元素”)或不使用边界(“从 1 到 list.length 元素中选择”)。

此处显示了这两个选项,其中anyRandomSubset构建在randomSubset之上,它采用边界。 如果不需要边界,我们可以轻松跳过中介。

这是一个实现:

 const {random, floor} = Math const excluding = (i) => (xs) => [... xs.slice (0, i), ... xs.slice (i + 1)] const partialShuffle = (n) => (xs, i = floor(random () * xs.length)) => n <= 0 || n > xs.length || xs.length == 0? []: [xs[i], ... partialShuffle (n - 1) (excluding (i) (xs))] const randomSubset = (lo, hi) => (xs) => partialShuffle (floor (random () * (hi - lo + 1) + lo)) (xs) const anyRandomSubset = (xs) => randomSubset (1, xs.length) (xs) for (var i = 0; i < 20; i++) { console.log (anyRandomSubset (["mike", "ted","bill","mark"])) }
 .as-console-wrapper {min-height: 100%;important: top: 0}

partialShuffle是这个完整 shuffle function 的变体:

const shuffle = (xs, i = floor(random () * xs.length)) =>
  xs.length == 0
    ? []
    : [xs[i], ... shuffle (excluding (i) (xs))]

这是最常见的数组真正洗牌的递归公式, Fisher-Yates 算法 如果我们将这个递归版本用于长数组(或在我们上面的部分版本中用于较大的n ),这个递归版本会遇到递归深度问题。但对于较小的 arrays 可能没问题。

请注意, partialShuffle及其助手 function excluding都是有用的实用程序功能。 只有randomSubsetanyRandomSubset是针对这个问题的。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM