Javascript:尝试从多个没有匹配的数组中采样,在不应该的时候循环递增
Javascript: Trying to sample from multiple arrays without matches, loop increments when it shouldn't
我正在尝试在实验中随机化字母字符串的呈现。理想情况下,我会让javascript创建一个指定长度的数组,包括实验的所有刺激。
因为有些字符串是彼此的变体,所以我想避免一些匹配。并非所有数组都有变体,但对于那些有变体的数组,顺序保持不变,因此 X[i] 是 Y[i 的变体]。
为了清楚起见,我将概述我想避免的比赛。如果位置 i 中的项位于目标数组中,则不应包含这些数组的位置 i 中的项。这些关系是对称的
letterstring_stimuli_a[i] 不能包含在 exemplar_flavoured_a[i] 或 模棱两可[i]
letterstring_stimuli_b[i] 不能包含在 exemplar_flavoured_b[i] 或 模棱两可[I].
rule_flavoureda[i] 不能包含在 rule_flavouredb[i] 中
参与者在随机样本上接受letterstring_training_a和letterstring_training_b的训练,该数组stimuli_random_order。这就是为什么代码引用了一个你看不到的数组(我想我会通过省略该代码来释放空间)
我已经设置了一个 for 循环,该循环仅在将项目添加到目标数组(在本例中为"transfer_random")时才应递增,以便我最终得到一个长度为 12 的数组。然而,当我运行脚本时,我得到的数组通常长度为 <12。我不确定为什么会这样。
我已经遇到这个问题几天了(我不是程序员,我的javascript很差)。
为什么循环创建长度为 <12 的数组,我该如何解决这个问题?
//def array search function to use to make sure that items aren't repeated
function include(arr,obj) {
return (arr.indexOf(obj) != -1);
}
//stimuli
//training stimuli
var letterstimuli_training_a = ['<p>Spaksvot</p>' ,'<p>Nosedont</p>', '<p>Quitinoct</p>', '<p>Peatikit</p>'];
var letterstimuli_training_b = ['<p>Blasimark</p>', '<p>Lonsink</p>', '<p>Martwok</p>', '<p>Zarbarak</p>'];
//ambiguous transfer
var ambiguousb = ['<p>Spaksvok</p>' ,'<p>Nosedonk</p>', '<p>Quitinock</p>', '<p>Peatikik</p>'];
var ambiguousa = ['<p>Blasimart</p>', '<p>Lonsint</p>', '<p>Martwot</p>', '<p>Zarbarat</p>'];
//exemplar flavoured transfer items defined by their base group
var exemplar_flavoureda = ['<p>Spaksvog</p>' ,'<p>Nosedong</p>', '<p>Quitinocg</p>', '<p>Peatikig</p>'];
var exemplar_flavouredb = ['<p>Blasimarg</p>', '<p>Lonsing</p>', '<p>Martwog</p>', '<p>Zarbarag</p>'];
//rule flavoured transfer
var rule_flavoureda = ['<p>Dregot</p>', '<p>Flowsat</p>', '<p>Graflat</p>', '<p>Joshwat</p>']
var rule_flavouredb = ['<p>Dregok</p>', '<p>Flowsak</p>', '<p>Graflak</p>', '<p>Joshwak</p>']
//stimuli order with answers and description strings
var stimuli_random_order = [];
var answers = [];
var text_answers = [];
var transfer_random = [];
var transfer_answers = [];
var transfer_text_answers = [];
//randomly populate transfer array
for(var i = 0; i<12; i++) {
if(Math.floor(Math.random()*7)===0){
var random = Math.floor(Math.random()*stimuli_random_order.length)
if(include(transfer_random, stimuli_random_order[random])) {i--} //no doubles
else if(include(stimuli_random_order, transfer_random[i-2]) & include(stimuli_random_order, transfer_random[i-1])){i--} //no more than three in a row
else if(include(transfer_random, exemplar_flavoureda, random)) {i--} //if the variant of this item from exemplara is already in the array, go back
else if(include(transfer_random, ambiguousb, random)) {i--}
else {
transfer_random.push(stimuli_random_order[random])
transfer_answers.push(answers[random])
transfer_text_answers.push(text_answers[random])
}
}
else if(Math.floor(Math.random()*7)===1) {
var random = Math.floor(Math.random()*exemplar_flavoureda.length)
if(include(transfer_random, exemplar_flavoureda[random])) {i--}
else if(include(exemplar_flavoureda, transfer_random[i-2]) & include(exemplar_flavoureda, transfer_random[i-1])) {i--}
else if(include(transfer_random, letterstimuli_training_a[random])) {i--}
else if(include(transfer_random, ambiguousb[random])) {i--}
else {
transfer_random.push(exemplar_flavoureda[random])
transfer_answers.push(90)
transfer_text_answers.push('ambiguous a base')
}
}
else if(Math.floor(Math.random()*7)===2) {
var random = Math.floor(Math.random()*exemplar_flavouredb.length)
if(include(transfer_random, exemplar_flavouredb[random])) {i--}
else if(include(exemplar_flavouredb, transfer_random[i-2]) & include(exemplar_flavouredb, transfer_random[i-1])) {i--}
else if(include(transfer_random, ambiguousa[random])) {i--}
else if(include(transfer_random, letterstimuli_training_b[random])) {i--}
else {
transfer_random.push(exemplar_flavouredb[random])
transfer_answers.push(191)
transfer_text_answers.push('ambiguous b base')
}
}
else if(Math.floor(Math.random()*7)===3) {
var random = Math.floor(Math.random()*ambiguousa.length)
if(include(transfer_random, ambiguousa[random])) {i--}
else if(include(ambiguousa, transfer_random[i-2]) & include(ambiguousa, transfer_random[i-1])) {i--}
else if(include(transfer_random, letterstimuli_training_a[random])) {i--}
else if(include(transfer_random, exemplar_flavoureda[random])) {i--}
else {
transfer_random.push(ambiguousa[random])
transfer_answers.push(90)
transfer_text_answers.push('category a')
}
}
else if(Math.floor(Math.random()*7)===4) {
var random = Math.floor(Math.random()*ambiguousb.length)
if(include(transfer_random, ambiguousb[random])) {i--}
else if(include(ambiguousb, transfer_random[i-2]) & include(ambiguousb, transfer_random[i-1])) {i--}
else if(include(transfer_random, letterstimuli_training_b[random])) {i--}
else if(include(transfer_random, exemplar_flavouredb[random])) {i--}
else {
transfer_random.push(ambiguousb[random])
transfer_answers.push(191)
transfer_text_answers.push('category b')
}
}
else if(Math.floor(Math.random()*7)===5) {
var random = Math.floor(Math.random()*rule_flavoureda.length)
if(include(transfer_random, rule_flavoureda[random])) {i--}
else if(include(rule_flavoureda, transfer_random[i-2]) & include(rule_flavoureda, transfer_random[i-1])) {i--}
else if(include(transfer_random, rule_flavouredb[random])) {i--}
else {
transfer_random.push(rule_flavoureda[random])
transfer_answers.push(90)
transfer_text_answers.push('category a')
}
}
else if(Math.floor(Math.random()*7)===6) {
var random = Math.floor(Math.random()*rule_flavouredb.length)
if(include(transfer_random, rule_flavouredb[random]) ){i--}
else if(include(rule_flavouredb, transfer_random[i-2]) & include(rule_flavouredb, transfer_random[i-1])) {i--}
else if(include(transfer_random, rule_flavoureda[random])) {i--}
else {
transfer_random.push(rule_flavouredb[random])
transfer_answers.push(191)
transfer_text_answers.push('category b')
}
}
}
我相信你的 if/else 逻辑存在错误 - 你正在检查每个条件中的一个新的随机值,所以有可能(甚至可能)12 次迭代中至少有 1 次永远不会回答条件。您需要做的是在每次迭代开始时将随机值保存到变量中,然后在每个条件下检查它:
var rand = Math.floor(Math.random()*7);
if( rand === 0 ){/*code*/}
else if( rand === 1){/*code*/}
....
else if( rand === 6){/*code*/}
- 我想在AngularJS应用程序中创建一个输入数字框,用户不应该在该框上键入十进制数字.(一个整数输入框)
- javascript代码不会在循环后执行
- 如何在不进入无限循环的情况下将网站重定向到Facebook画布URL
- Javascript代码添加了一些不应该存在的内容
- 如何在循环中使用jQuery.on()方法,而不覆盖我循环的对象
- 我应该如何循环通过和“;关联对象“;在javascript中
- 有没有任何情况下,一个方法不应该是原型方法
- 为什么不'当循环停止时
- 当我认为它不应该重新渲染视图时,如何防止 Meteor 在 html 选择 dom 单击事件上重新渲染视图
- Node.js Promise - 代码不应该等到 .then 完成()
- 跳跃运动:旋转轴 – 如果手静止不动,它不应该在 0 左右
- 使用RegExp循环数组而不是for循环(Javascript)
- 如何在 html 和 javascript 中显示隐藏不确定的循环进度条
- 如果我不应该在组件WillUpdate中调用setState,如何更新状态(使用ReactJS)
- Javascript:尝试从多个没有匹配的数组中采样,在不应该的时候循环递增
- 不应该发生的无限循环
- 为什么我不应该在循环中制作函数
- 为什么我应该使用 .forEach 语法而不是 for 循环语法
- 为什么我不应该在Javascript的循环中制作函数
- 如果一个变量是在for循环之前声明的,那么它的值不应该在for循环之后可访问