![](/img/trans.png)
[英]Javascript, how do i get two corresponding elements from an array to generate at the same time with the random feature?
[英]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
都是有用的实用程序功能。 只有randomSubset
和anyRandomSubset
是针对这个问题的。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.