Javascript Math.random()>=0.5和Math.random()-0.5之间有什么区别

Javascript Math.random()>=0.5和Math.random()-0.5之间有什么区别,javascript,Javascript,我想生成一个长度为n的数组,数组的元素是2到32之间的随机整数。我使用follow函数,但我发现17始终是返回数组的第一个元素。此外,当我将sort函数改为sort=>Math.random-0.5时,它工作得很好 所以我很困惑,Math.random>=0.5和Math.random-0.5之间有什么区别?这种差异如何影响排序功能 常数fn=n=>{ 设arr=[]; 对于设i=2;iMath.random>=0.5.0,n } 对于js sort,param是compare函数,需要返回3

我想生成一个长度为n的数组,数组的元素是2到32之间的随机整数。我使用follow函数,但我发现17始终是返回数组的第一个元素。此外,当我将sort函数改为sort=>Math.random-0.5时,它工作得很好

所以我很困惑,Math.random>=0.5和Math.random-0.5之间有什么区别?这种差异如何影响排序功能

常数fn=n=>{ 设arr=[]; 对于设i=2;i<33;i++{ 普希阿罗; } 返回arr.sort=>Math.random>=0.5.0,n } 对于js sort,param是compare函数,需要返回3个值:负、零、小于、等于和大于的正值

如果使用>=,它只返回布尔值。

对于js排序,参数是比较函数,需要返回3个值:负、零、小于正、等于正和大于正

如果您使用>=,它只返回布尔值。

您没有出于预期目的使用排序,因此结果是不可预测的、怪异的,并且在不同的浏览器实现中可能会有所不同。如果要洗牌数组

传递到Array.sort的函数应接受两个参数x和y,如果xy,则返回正值

在第一次尝试中,使用sort=>Math.random>=0.5,它返回一个布尔值;这将被转换为0或1。这意味着您的函数告诉排序器,您传入的第一个参数总是等于或大于您传入的第二个参数。每次调用函数时,都会将17作为第二个参数传入;您告诉浏览器它因此小于或等于数组中的所有其他元素,因此它将放在数组的开头

您的第二次尝试使用sort=>Math.random-0.5,返回的概率相等,即第一个数字大于第二个,反之亦然,这使得洗牌效果更好。然而,由于整个过程的不可靠性,不能保证洗牌在所有浏览器中都能正常工作,或者是随机的。请使用上面链接的真正的洗牌算法

来源:

您使用sort不是出于预期目的,因此结果是不可预测的、怪异的,并且在不同的浏览器实现中可能会有所不同。如果要洗牌数组

传递到Array.sort的函数应接受两个参数x和y,如果xy,则返回正值

在第一次尝试中,使用sort=>Math.random>=0.5,它返回一个布尔值;这将被转换为0或1。这意味着您的函数告诉排序器,您传入的第一个参数总是等于或大于您传入的第二个参数。每次调用函数时,都会将17作为第二个参数传入;您告诉浏览器它因此小于或等于数组中的所有其他元素,因此它将放在数组的开头

您的第二次尝试使用sort=>Math.random-0.5,返回的概率相等,即第一个数字大于第二个,反之亦然,这使得洗牌效果更好。然而,由于整个过程的不可靠性,不能保证洗牌在所有浏览器中都能正常工作,或者是随机的。请使用上面链接的真正的洗牌算法


资料来源:

众所周知,微软差点被起诉,因为他们正是这样做的:TIL。这是一篇非常简洁的文章,它应该向OP演示如何不使用该功能!谢谢你的链接!为什么每次调用函数时都将17作为第二个参数传入?这取决于浏览器如何实现排序。我可以看到它被选为快速排序中的第一个轴。或者因为它在数组的中间,所以它可能已经结束了,因为合并中的合并步骤可以将它与每个其他项目进行比较。同样,这完全取决于浏览器的排序实现,您的结果肯定会有所不同。众所周知,微软几乎被起诉,因为他们正是这样做的:TIL。这是一篇非常简洁的文章,它应该向OP演示如何不使用该功能!谢谢你的链接!为什么每次调用函数时都将17作为第二个参数传入?这取决于浏览器如何实现排序。我可以看到它被选为快速排序中的第一个轴。或者因为它在数组的中间,所以它可能已经结束了,因为合并中的合并步骤可以将它与每个其他项目进行比较。同样,这完全取决于浏览器的排序实现,以及 你的结果肯定会有所不同。