我在空白的重定向程序页面上有一个非常简单的Javascript,用于随机将人们重定向到2个网站中的一个。
<script type="text/javascript">
var urls = new Array("http://www.google.com", "http://www.yahoo.com");
window.location = urls[Math.floor(urls.length*Math.random())];
</script>
如果反复点击此重定向器的链接,则登陆Google或Yahoo的几率似乎为50/50。然而,当要求很多人点击它时,他们似乎绝大多数都是第一次点击雅虎。第一次只有一对夫妇被带到谷歌。
任何线索,为什么??
答案 0 :(得分:0)
ECMAScript / javascript将Math.random()
定义为:
返回带有正号的Number值,大于或等于0 但小于1,随机选择或伪随机选择近似 在该范围内均匀分布,使用 依赖于实现的算法或策略。这个功能不需要 参数。
为了保证有一个近似均匀的分布,显然需要一个众所周知的数学算法(并且有相当一部分)。因此,结果(取决于算法无限)序列的分布与样本大小相关。
所以,你是正确的,从长远来看......你会在同一个会话期间在同一主机上接近50/50分发!
...这是影响你的测试结果及其解释的前两件事:
这意味着,您(测试结果序列的接收者)获得的东西非常接近真正的随机性......均匀分布只能播种到无数样本中 - 大小!
强制性迪尔伯特:
来源:http://dilbert.com/strip/2001-10-25
现在,如果您说您已经获得了大量的测试结果,其中您发现了对特定操作系统/浏览器/主机组合的显着偏见,其中明显偏向Math.random
返回高于{的值{1}}作为您的页面/应用程序加载后的第一个值,然后请分享/证明该信息(哪个浏览器(-version)在哪个操作系统上???这将是有趣的,事实上唯一可以认真进一步的事情调查)!!!
我在下面添加了一些测试演示(请注意输出textarea pre -pends输出):
现在,第四个按钮很有趣,并探讨了您更好地利用随机解决方案的想法(您评论了另一个错误答案):通过添加现有数据集的副本来增加数据集。
将0.5
又名["http://www.google.com", "http://www.yahoo.com"]
更改为[0,1]
只是您的数据集重复或相乘(因为[0,1,0,1]
会对[0,1,0]
产生明显的偏见。因此,因子1是裸数据集0
,因子2是[0,1]
等
在不增加数据集但只计算等效数据的情况下,我们可以得到相同的行为:[0,1,0,1]
WolframAlpha上的PLOT:
plot floor((x*f)*r)mod x where x=2, f=4 for r=0 to 0.99999
分别是:floor( (array.length * factor) * random ) % array.length
(又名array.length)和x=number of items
请注意,与f=factor
或round
一起展示为什么ceil
提供最佳分配是很有趣的。还可以使用floor
和x
来查看为什么会这样做。
单击该按钮会显示10个随机值(缩小到前3个字符,因此缩小1个十进制数字),然后显示前5个因子的结果(作为表格)。
点击它多次,看看每个因素如何仍然可以得到类似Dilbert的重复或短期交替。看看没有哪些因素(在示例中)给出了合理的改进:选择一个最喜欢的&#39;因素,多次点击该按钮,看看它是否仍然是您最喜欢的&#39;,选择一个新的&#39;最爱&#39;,冲洗并重复...
f
或0
,以1
分隔(空格和标签将被忽略))
这玩具很有意思。随机化ORDER结合javascript随机的近似均匀分布仍然不应该显着偏向结果。
,
&#13;
建议全屏运行代码段。