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] cannot be included with exemplar_flavoured_a[i] or
ambiguousb[i]
letterstring_stimuli_b[i] cannot be included with exemplar_flavoured_b[i] or
ambiguousa[i].
rule_flavoureda[i] cannot be included with rule_flavouredb[i]
参与者在 letterstring_training_a 和 letterstring_training_b 的随机样本上接受训练,这个数组是 stimuli_random_order。这就是代码引用一个你看不到的数组的原因(我想我可以通过省略该代码来释放 space)
我已经设置了一个 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*/}
我试图在实验中随机显示字母串。理想情况下,我会 javascript 创建一个指定长度的数组,包括实验的所有刺激。
因为一些字符串是彼此的变体,所以我想避免一些匹配。并非所有数组都有变体,但对于那些有变体的数组,顺序保持不变,因此 X[i] 是 Y[i] 的变体。
为清楚起见,我将概述我想避免的匹配项。如果位置 i 的项目在目标数组中,则不应包括这些数组的位置 i 的项目。这些关系是对称的
letterstring_stimuli_a[i] cannot be included with exemplar_flavoured_a[i] or ambiguousb[i]
letterstring_stimuli_b[i] cannot be included with exemplar_flavoured_b[i] or ambiguousa[i].
rule_flavoureda[i] cannot be included with rule_flavouredb[i]
参与者在 letterstring_training_a 和 letterstring_training_b 的随机样本上接受训练,这个数组是 stimuli_random_order。这就是代码引用一个你看不到的数组的原因(我想我可以通过省略该代码来释放 space)
我已经设置了一个 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*/}