gpt4 book ai didi

javascript - JavaScript 中的随机重复序列

转载 作者:行者123 更新时间:2023-12-03 06:47:09 25 4
gpt4 key购买 nike

我编写了这个 Matlab 代码来生成随机 [1 0] 和 [2 0] 的向量:

nTrials = 8; 
Seq1 = [1 0]; % sequence 1
Seq2 = [2 0]; % sequence 2

a=repmat(Seq1,(nTrials/4),1);
b=repmat(Seq2,(nTrials/4),1);
abcd = vertcat(a,b); % concatenate all three couples
CouplesOrderStruct = abcd(randperm(size(abcd,1)),:); % couples in columns
vector = (reshape(CouplesOrderStruct.',[],1))';

结果是一个向量,如:[1 0 2 0 2 0 1 0]

代码解释:

我有两个数字序列,1-0 和 2-0,我想在向量中随机化它们。

  1. 首先,在 a = repmat(Seq1,(nTrials/4),1); b=repmat(Seq2,(nTrials/4),1);我创建固定数量的序列
  2. 其次,我将 a 和 b 放在一起:abcd = vertcat(a,b); % concatenate all three couples
  3. 第三,我将 CouplesOrderStruct = abcd(randperm(size(abcd,1)),:); 中的这些序列随机化。

结果是一个向量,其中 1-0 和 2-0 的数量相同,但顺序是随机的

有没有办法用 JavaScript 获得相同的结果?

最佳答案

所以我刚刚为你构建了一个很好的小型文档化函数:

function randomRepeatSequence(sequences, times) {
// times has to be a multiple of sequences.length
if (times % sequences.length !== 0)
return console.log("times has to be a multiple of sequences.length");

// Remap our sequence-array so we can store the count it has been used
var seqmap = [];
for (var seqid = 0; seqid < sequences.length; seqid++)
// Push the current sequence n times; n = times/sequences.length
for (var idx = 0; idx < times/sequences.length; idx++)
seqmap.push(sequences[seqid]);

var resultmap = [];
// Now just select and remove a random sequence from our seqmap, until it is empty
while (!seqmap.length == 0) {
// Select a random element
var randomidx = Math.floor(Math.random()*seqmap.length);
var currentElement = seqmap[randomidx];
// remove the random element from seqmap...
seqmap.splice(randomidx, 1);
// .. and push it to the resultmap
resultmap.push(currentElement);
}

// now our resultmap looks like [[1],[2],[3]]... just flatten it!
var result = resultmap.reduce( function(a, b) {
return a.concat(b);
});

return result;
}

你可以像这样使用它

console.log(randomRepeatSequence([[1,0], [2,0]], 4));

或者,更好地理解:

var seqlist = [
[1, 0],
[2, 0]
]
randomRepeatSequence(seqlist, 4)

请注意,times 参数仅采用必须使用的序列数量,而不是结果的长度。但你只需要通过像

这样的简单步骤来计算
randomRepeatSequence(seqlist, 8/seqlist[0].length)

(给出 4,因为 seqlist[0].length = 2 并且 8/2 是 4)

<小时/>

原始答案

您的结果例如

vector = 2 0 1 0 2 0 1 0

我猜 seq1 和 seq2 应该包含相同的次数。我决定使用一种易于理解的方法,即使我可以做得更短:

var trials = 8; // has to be even

var seq1 = [1, 0];
var seq2 = [2, 0];

// "Build" a sequence list
var seqlist = [
seq1, seq1,
seq2, seq2
]

var list = []

for (var n = 0; n < trials/2; n++) {
// search a random entry
var index = Math.floor(Math.random()*seqlist.length);
var toUseSeq = seqlist[index];

// delete the entry
seqlist.splice(index, 1);

list.push(toUseSeq);
}
// flatten result array

var result = list.reduce( function(a, b) {
return a.concat(b);
});

console.log(result);

执行此命令会给我以下控制台输出之一:

[ 2, 0, 1, 0, 2, 0, 1, 0 ] 
[ 2, 0, 1, 0, 2, 0, 1, 0 ]
[ 1, 0, 1, 0, 2, 0, 2, 0 ]
[ 1, 0, 2, 0, 1, 0, 2, 0 ]

关于javascript - JavaScript 中的随机重复序列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37685714/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com