Javascript:尝试从多个没有匹配的数组中采样,在不应该的时候循环递增

Javascript: Trying to sample from multiple arrays without matches, loop increments when it shouldn't

本文关键字:不应该 候循环 循环 采样 数组 Javascript      更新时间:2023-09-26

我正在尝试在实验中随机化字母字符串的呈现。理想情况下,我会让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*/}