HTML 代码中的 JavaScript:随机数不是均匀分布的



>我遇到了以下问题:
我正在使用Python在Amazon mturk上上传一项调查,该调查是通过HTML和javascript完成的。我向参与者展示调查的三个不同版本之一,我通过javascript生成一个随机数来选择。我将号码存储在本地存储中,以防止刷新网站重置它。我发现的问题是,似乎有更多的人获得版本 1 而不是版本 3。但是在 Tryit 编辑器中在线运行代码时,我无法为自己重现问题。

你能帮我理解(并解决(为什么会发生这种情况吗?以下是我上传的(修剪后的(HTML 代码。我替换了文本并删除了绒毛。

<HTMLQuestion xmlns="http://mechanicalturk.amazonaws.com/AWSMechanicalTurkDataSchemas/2011-11-11/HTMLQuestion.xsd">
<HTMLContent><![CDATA[
<!-- YOUR HTML BEGINS -->
<!DOCTYPE html>
<html>
<head>
<meta http-equiv='Content-Type' content='text/html; charset=UTF-8'/>
<script type='text/javascript' src='https://s3.amazonaws.com/mturk-public/externalHIT_v1.js'></script>
<script>
function test(){
document.getElementById('txt-field').value = "1";
}
</script>
</head>
<body>
<form name='mturk_form' method='post' id='mturk_form' action='https://www.mturk.com/mturk/externalSubmit'><input type='hidden' value='' name='assignmentId' id='assignmentId'/>
<span>
<INPUT TYPE="text" NAME="link_click" id='txt-field' value="0" style="display: none">    
<div><h3><a href="www.google.com" target="_blank" id='report420' onclick="test()" >link</a></h3>
Instructions</div>
<div><table border="1" style="height: 258px;" width="196"><tbody>Table</tbody></table></div>
</span>
<!--I think the relevant part starts here-->
<script> 
document.write("Miscellaneous question");
var i = localStorage.getItem('i') || Math.floor(3*Math.random());
localStorage.setItem('i',i);
if (i==0){
document.write("Version 1");
}
if (i==1){
document.write("Version 2");
}
if (i==2){
document.write("Version 3");
}
document.write("Miscellaneous question");
</script>
<p><input type='submit' id='submitButton' value='Submit' /></p></form>
<script language='Javascript'>turkSetAssignmentID();</script>
</body></html>
<!-- YOUR HTML ENDS -->
]]>
</HTMLContent>
<FrameHeight>600</FrameHeight>
</HTMLQuestion>

随机函数Math.floor(3*Math.random())具有均匀分布,但我认为 400 个样本不足以让您看到它的实际效果(如@desoares所述(。

测试代码:

var count = [0, 0, 0];
var n = 1000000;
document.write('Testing for ' + n + ' samples : ');
for (var i = 0; i < n; i++) {
count[Math.floor(3*Math.random())]++;
}
document.write(JSON.stringify(count));

var count = [0, 0, 0];
var n = 400;
document.write('Testing for ' + n + ' samples : ');
for (var i = 0; i < n; i++) {
count[Math.floor(3*Math.random())]++;
}
document.write(JSON.stringify(count));

此外,如果要确保来自同一台计算机的人员不会被迫使用相同的版本,则应在提交时清除保存的变量localStorage.removeItem('i');。您还可以添加过期机制。

最新更新