我试图了解如何以随机顺序对数组进行排序。因此,我找到了以下代码:
var as = ["max","jack","sam"];
var s = as.sort(func);
function func(a, b) {
return 0.5 - Math.random();
}
console.log(s);
我的主要问题是为什么他们使用 0.5而不是其他数字? 和它如何真正起作用,请尝试使其变得简单,因为我是javascript的新手,并且正在为这些事情而苦苦挣扎
答案 0 :(得分:9)
Math.random()返回0 and 1
之间的数字(不包括)。我们使用0.5
是因为它是平均值。
Array.sort()根据返回值对参数进行排序。因此,0.5 - Math.random()
将以相等的概率产生正值或负值。因此,它将对参数随机进行排序。
Array.sort
的返回值为正,则该索引的索引
第一个参数将比第二个参数更高。0
,则不执行任何操作。答案 1 :(得分:8)
您曾经使用过
var as = ["max","jack","sam"];
var s = as.sort(func);
function func(a, b) {
return 0.5 - Math.random();
}
console.log(s);
这里最重要的是as.sort(func)
。
func(a,b)
将返回[-0.5,0.5]
范围内的值。
因为此函数返回0.5 - Math.random()
,而Math.random()将返回[0,1]
范围内的浮点值。
这样您的func
将返回[-0.5,0.5]
范围内的值。
这意味着排序顺序将设置为increase
或decrease
。
这是随机的。
这样您的结果将是随机的
var as = ["max","jack","sam"];
var s = as.sort(func);
function func(a, b) {
return Math.random();
}
console.log(s);
var as = ["max","jack","sam"];
var s = as.sort(func);
function func(a, b) {
return 0 - Math.random();
}
console.log(s);
var as = ["max","jack","sam"];
var s = as.sort(func);
function func(a, b) {
return 0.5 - Math.random();
}
console.log(s);
答案 2 :(得分:5)
Math.random()返回介于 0到1(包括0但不包括1)之间的随机值 。 所以0.5充当中点。如果使用大于1或小于0的使用值,它将始终为true或false。 因此,使用0.5。
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Math/random
让我们通过示例进一步了解
var as = ["max","jack","sam"];
var s = as.sort(func);
function func(a, b) {
return 0.5 - Math.random();
}
console.log(s);
这是使用大于1的值时得到的结果
var as = ["max","jack","sam"];
var s = as.sort(func);
function func(a, b) {
return 1 - Math.random();
}
console.log(s);
使用小于0的值会发生这种情况
var as = ["max","jack","sam"];
var s = as.sort(func);
function func(a, b) {
return -1 - Math.random();
}
console.log(s);
PS :-
尝试从上述所有条件打印输出,您将看到最后两个条件将始终从函数返回true或false。这样就不会进行随机排序。
现在谈论从0到0.99的任何值,您可以使用任何值,但是0.5可以最好地满足您的目的。因为这是一个中间点,您最有可能获得最佳答案。
答案 3 :(得分:1)
Math.random
返回0到1之间的数字。
排序函数使用返回值x
如下:
x == 0
:相同的值,可以按“想要的方式”订购
x < 0
:第一个对象小于第二个对象,因此它在排序数组中的索引将小于另一个对象的
x > 0
与x < 0
相同,但反之亦然
由于Math.random
返回0到1之间的数字,并且我们还希望获得负数,因此必须减去一些值。
在这里0.5 - Math.random()
给出的数字介于0.5到-0.5
答案 4 :(得分:1)
如果您只是想随机地将元素移至其起始位置附近,请确保将sort
与random
一起使用,但是在大多数情况下,这不是您想要的。您想彻底改组数组,完全随机化每个元素的位置。对于内置random
函数中的sort
来说,这是一个糟糕的做法,因为它偏向初始状态,这意味着“改组”数组中的元素将倾向于保持在其位置附近(靠近起点的人很有可能停留在起点附近,等等。)。数组的大小越大,被拖曳的次数就越少。
以下是证明:Is it correct to use JavaScript Array.sort() method for shuffling?
这是我大部分时间使用的数组改组函数。它彻底随机化每个元素的位置。
function shuffle(arr) { // randomly rearanges the items in an array
const result = [];
for (let i = arr.length-1; i >= 0; i--) {
// picks an integer between 0 and i:
const r = Math.floor(Math.random()*(i+1)); // NOTE: use a better RNG if cryptographic security is needed
// inserts the arr[i] element in the r-th free space in the shuffled array:
for(let j = 0, k = 0; j <= arr.length-1; j++) {
if(result[j] === undefined) {
if(k === r) {
result[j] = arr[i]; // NOTE: if array contains objects, this doesn't clone them! Use a better clone function instead, if that is needed.
break;
}
k++;
}
}
}
return result;
}
答案 5 :(得分:0)
如果您使用函数参数调用sort
方法,则会被多次调用。此函数应接受两个参数(让我们分别调用第一个A和第二个B):每次它应返回一个值:
因此,在此示例中,我们需要均匀分布负值和正值的随机返回值。由于Math.random()
返回0到1之间的值,因此0.5 - Math.random()
将返回-0.5到0.5之间的值,符合要求。
答案 6 :(得分:0)
为了回答“如何以随机顺序对数组进行排序”的问题,正如其他人所提到的,Array.sort() 函数可以将函数作为参数。
语法:
Array.sort([sort_by_function()])
内部 sort_by_function()
接受两个参数(例如:x & y)并且使用 Math.random()
返回 -0.5 到 0.5 之间的值,它返回:
请记住,如果您不向外部 Array.sort()
函数传递任何内容,它只会按 升序 顺序重新排列/排序元素,但是,如果您传递一个函数 (作为参数),然后它的行为基于内部 sort_by_function()
返回的内容,因为它交换给定数组的每个元素(通过一次交换两个元素对),这种交换是根据什么决定的内部 sort_by_function()
返回。
为了实现随机排序,Array.sort()
函数将对每对元素进行如下重新排列/排序,对于 a:
示例:
arr.sort(function(x,y){return Math.random() - 0.5});
由于没有人提到使用短 Lambda 表达式,这里是一个示例,说明如何通过使用 Lambda 表达式来缩短内部参数函数,如下所示:
arr.sort(() => Math.random() - 0.5);